Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

C++, Передать тип как параметр

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
nut888
Гость





СообщениеДобавлено: Пт Мар 15 2002 14:59    Заголовок сообщения: C++, Передать тип как параметр Ответить с цитатой

Можно ли в C++ в рамках стандарта ANSI
передавать типы как параметры?
Меня интересует как лучше реализовать пример
такого кода.

class abstract { ... };
class t1 { ... } : abstract;
class t2 { ... } : abstract;
class container {
abstract *p;
static abstract *create(TYPE *t);
... }

abstract *container::create(TYPE *t)
{ container *c;
...
c=new container;
c->p=new(t);
}

...
container *c;
c=create(t1);

Как написать код так, чтобы при создании
класса t3 внесения изменения в код были бы
минимальны
Вернуться к началу
Alexy



Зарегистрирован: 22.10.2003
Сообщения: 48

СообщениеДобавлено: Пт Мар 15 2002 15:50    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

Способы полиморфного создания объектов есть,
но типы в качестве параметров передавать конечно нельзя, и тут что-то с примером не то.
Что означает
container *c;
c=create(t1); ???

abstract* instance = container::create(t1);

или что-то другое ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
JekLove



Зарегистрирован: 22.02.2002
Сообщения: 41
Откуда: Новосибирск

СообщениеДобавлено: Пт Мар 15 2002 18:59    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

Не, ну можно ведь использовать синтаксис шаблонов. Я так понимаю, что твой пример на чем-то ява-подобном... Короче, ежели в С++ не очень шаришь, про шаблоны коротко не расскажешь.
В любой книге про это есть.

Ну, приведу все же пример:

template
void my_func(const T & t)
{
vector container;
container.push_back(t);
/* and so on... */
}

Вот эта функция будет работать с любым типом:


class my_class { ... } my;
class my_derived : public my_class { ... } my2;
my_func(my);
my_func(my2);
int x;
my_func(x);


Поправь меня, если я неправильно понял твой вопрос.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nut888
Гость





СообщениеДобавлено: Пт Мар 15 2002 20:08    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

>>Не, ну можно ведь использовать синтаксис шаблонов. Я так понимаю, что твой пример на чем-то ява-подобном... Короче, ежели в С++ не очень шаришь, про шаблоны коротко не расскажешь.
>>В любой книге про это есть.
>>
>>Ну, приведу все же пример:
>>
>>template
>>void my_func(const T & t)
>>{
>> vector container;
>> container.push_back(t);
>> /* and so on... */
>>}
>>
>>Вот эта функция будет работать с любым типом:
>>
>>
>>class my_class { ... } my;
>>class my_derived : public my_class { ... } my2;
>>my_func(my);
>>my_func(my2);
>>int x;
>>my_func(x);
>>
>>
>>Поправь меня, если я неправильно понял твой вопрос.

Это решение меня устраивает
Хотя на самом деле здесь осуществляется
автоматическая генерация набора функций

А еще какие-нибудь решения есть
Вернуться к началу
JekLove



Зарегистрирован: 22.02.2002
Сообщения: 41
Откуда: Новосибирск

СообщениеДобавлено: Сб Мар 16 2002 10:03    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

Можно попробовать использовать механизм RTTI,
хотя, например, лично я его не люблю и использую крайне редко, так как он нарушает принципы настоящего объектно-ориентированного программирования.
Использование RTTI будет не таким гибким, как испльзование шаблонов, так RTTI в твоем случае применим только к иерархии классов, причем классы обязаны содержать виртуальные функции (ну, только в этом случае создаются виртуальные таблицы информации о классах, так я понимаю).
Кроме того, придется вставлять блок if-else для каждого класса. Я не очень понимаю, каким образом и вообще зачем приводит тип класс abstract к типу container (у тебя в примере так написано), так что приведу свой пример:


class material {
public:
virtual ~material() {}
};


class aluminum : public material {
public:
virtual ~aluminum() {}
};


class glass : public material {
public:
virtual ~glass() {}
};


class paper : public material {
public:
virtual ~paper() {}
};


// x - указатель типа material*
// ...
aluminum* ap = dynamic_cast(*x);
paper* pp = dynamic_cast(*x);
glass* gp = dynamic_cast(*x);

if(ap)
// ...
else if(pp)
// ...
else if(gp)
// ...
else
throw string("bad type of x!");



Что-то в этом духе.


зы: кстати, в предыдущем моем примере надо писать vector, а не просто vector.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nut888
Гость





СообщениеДобавлено: Сб Мар 16 2002 15:54    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

Спасибо
Виртуальные и чистые функции я использую
и RTTI обычно включаю
dynamic_cast
В чем недостаток данного метода и есть ли у
него альтернатива?
Вообще проблема у меня такая
Я не очень хорошо понимаю как можно управлять
механизмом привязки функций к создаваемому объекту
Если в С я могу свободно пребразовывать указатели как угодно то в С++ все сложнее
можно испоьзовать size_t чтобы зарезервировать память но виртуальные функции
видимо перегружены не будут

Тот пример что я привел в начале очень сильно
упрощен
класс abstract имеет большое число
чистых виртуальных функций
Класс container содержит несколько указателей аналогичных abstract.
Вернуться к началу
nut888
Гость





СообщениеДобавлено: Сб Мар 16 2002 17:18    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

Что-то не получилось у меня с шаблонами
Мой проект сейчас работает по такой схеме
и я вынужден пользоваться if и case, а
я уже перевалил 15000 строк
может подскажешь как сюда встроить
шаблон
Заранее большое спасибо


#include

class abstract
{
public:
virtual void print()=0;
};

class t1 : public abstract
{
public:
void print() { printf("t1\n"); }
};


class t2 : public abstract
{
public:
void print() { printf("t2\n"); }
};

class container
{
abstract *c;
public:
container() { c=NULL; }
~container() { delete c; }
abstract *get_c() { return c; }

static container *create1()
{ container *cc;
cc=new container;
cc->c=new t1;
return cc;
}

static container *create2()
{ container *cc;
cc=new container;
cc->c=new t2;
return cc;
}

};


int main()
{
container *ccc;
ccc=container::create1();
ccc->get_c()->print();
delete ccc;
return 0;
}
Вернуться к началу
JekLove



Зарегистрирован: 22.02.2002
Сообщения: 41
Откуда: Новосибирск

СообщениеДобавлено: Сб Мар 16 2002 20:13    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

Запросто:

#include

class abstract
{
public:
virtual void print () = 0;
};

class t1:public abstract
{
public:
void print ()
{
printf ("t1\n");
}
};


class t2:public abstract
{
public:
void print ()
{
printf ("t2\n");
}
};

class container
{
abstract *c;
public:
container ()
{
c = NULL;
}
~container ()
{
delete c;
}
abstract *get_c ()
{
return c;
}

template
static container *create ()
{
container *cc;
cc = new container;
cc->c = new T;
return cc;
}
};


int
main ()
{
container *ccc;
ccc = container::create();
ccc->get_c ()->print ();
delete ccc;
return 0;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JekLove



Зарегистрирован: 22.02.2002
Сообщения: 41
Откуда: Новосибирск

СообщениеДобавлено: Сб Мар 16 2002 20:20    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

Елки-палки, эта зараза удаляет лексемы в угловых скобках...
Еще раз (сейчас вместо угловых я испльзовал обратные квадратные):


#include ]stdio.h>[

class abstract
{
public:
virtual void print () = 0;
};

class t1:public abstract
{
public:
void print ()
{
printf ("t1\n");
}
};


class t2:public abstract
{
public:
void print ()
{
printf ("t2\n");
}
};

class container
{
abstract *c;
public:
container ()
{
c = NULL;
}
~container ()
{
delete c;
}
abstract *get_c ()
{
return c;
}

template ]typename T[
static container *create ()
{
container *cc;
cc = new container;
cc->c = new T;
return cc;
}
};


int
main ()
{
container *ccc;
ccc = container::create]t2[();
ccc->get_c ()->print ();
delete ccc;
return 0;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nut888
Гость





СообщениеДобавлено: Вс Мар 17 2002 09:35    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

С обратными скобками ничего не работает
VC их не понимает
с угловыми я получаю ошибку на
ccc = container::create()

;--------------------Configuration: test - Win32 Debug--------------------
Compiling...
test.cpp
F:\test_template\te.. : fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1794)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Error executing cl.exe.

test.exe - 1 error(s), warning(s)

А каким компилятором Вы пользовались
Я об использовании ][ вообще никогда не слышал
Вернуться к началу
JekLove



Зарегистрирован: 22.02.2002
Сообщения: 41
Откуда: Новосибирск

СообщениеДобавлено: Вс Мар 17 2002 09:48    Заголовок сообщения: Re: C++, Передать тип как параметр Ответить с цитатой

Блин, да я просто заменил все прямые угловые скобки обратными квадратными, чтобы на форуме код постился нормально... Скопируй мой последний код в файл и замени обратные квадратные скобки прямыми угловыми и компиль себе на здоровье...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nut888
Гость





СообщениеДобавлено: Вс Мар 17 2002 10:40    Заголовок сообщения: Ответ на: "Re: C++, Передать тип как пара..- JekLove- 17-03-2002 09:48" Re: C++, Передать тип как Ответить с цитатой

Так я так сразу и сделал
Не кампилится
Вернуться к началу
nut888
Гость





СообщениеДобавлено: Вс Мар 17 2002 10:43    Заголовок сообщения: Ответ на: "Re: C++, Передать тип как пара..- JekLove- 17-03-2002 09:48" Re: C++, Передать тип как Ответить с цитатой

А скобки действительно убрались
Я в свой предъдущий ответ просто не посмотрел
ссс=]t1[abstract::create();
на эту строку у меня ошибка
Вернуться к началу
nut888
Гость





СообщениеДобавлено: Вс Мар 17 2002 10:45    Заголовок сообщения: Re: Ответ на: "Re: C++, Передать тип как пара..- JekLove- 17-03-2002 09:48" Re: C++, Передать тип как параметр Ответить с цитатой

Перепутал
ссс=abstract::create]t1[();
Вернуться к началу
JekLove



Зарегистрирован: 22.02.2002
Сообщения: 41
Откуда: Новосибирск

СообщениеДобавлено: Вс Мар 17 2002 11:41    Заголовок сообщения: Смотри мыло(+) Ответить с цитатой

Слухай, что-то мне кажется, что у тебя проблемы.
Я тебя кинул исходник, который у меня отлично компилится. Я, кстати, юзаю gcc 3.0.3; надо, чтобы твой компайлер понимал "member templates".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nut888
Гость





СообщениеДобавлено: Вс Мар 17 2002 13:21    Заголовок сообщения: Re: Смотри мыло(+) Ответить с цитатой

Спасибо
Дело в моем компиляторе VC 6.0
Буду с ним разбираться
К сожалению от него мне не отказаться
так как это единственный компилятор
сертифицированный UG (под это я пишу)
в среде Windows
Вернуться к началу
JekLove



Зарегистрирован: 22.02.2002
Сообщения: 41
Откуда: Новосибирск

СообщениеДобавлено: Вс Мар 17 2002 13:37    Заголовок сообщения: Re: Смотри мыло(+) Ответить с цитатой

Не, погоди, я не понял: код-то скомпилился?
Если не хочет, то почему бы не вынести метод create во внешнюю функцию?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nut888
Гость





СообщениеДобавлено: Вс Мар 17 2002 14:56    Заголовок сообщения: Re: Смотри мыло(+) Ответить с цитатой

Написал наконец
Большое спасибо за идею
Привожу код
][ ==> ....


#include ]stdio.h[

class abstract
{
public:
virtual void print () = 0;
};

class t1:public abstract
{
public:
void print ()
{
printf ("t1\n");
}
};


class t2:public abstract
{
public:
void print ()
{
printf ("t2\n");
}
};

class container
{
abstract *c;
public:
container ()
{
c = NULL;
}
~container ()
{
delete c;
}
abstract *get_c ()
{
return c;
}

template]typename T[
static container *create (T*)
{
container *cc;
cc = new container;
cc->c = new T;
return cc;
}
};


int main ()
{
container *ccc;
ccc = container::create((t2*)NULL);
ccc->get_c ()->print ();
delete ccc;
return 0;
}
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...