Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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; } |
|
Вернуться к началу |
|
|
|