| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Наследование классов |
| Автор: uvsoft 2.4.2005, 21:38 | ||||||||
Итак, есть следующий набор классов:
Подскажите, что необходимо передать в конструктор класса SYSTEM, чтобы сказать ему какой именно производный класс от OBJECT необходимо истользовать для инициализации указателя pobj. Т.е. грубо говоря есть куча потомков, чисто которых постоянно увеличивается и чтобы истользовать вновь созданного потомка достаточно изменить где-то в main одну строчку:
Сопоставлять каждому потомку какай-нибудь идентификатор и проверять потом НЕ ПОЙДЕТ:
Хочется чего-нибудь универсального
|
| Автор: Daevaorn 2.4.2005, 22:58 | ||
| Сделай конструктор класса SYSTEM с параметром типа OBJECT * тогда вот тебе как вариант:
|
| Автор: Artiom 3.4.2005, 09:46 | ||||
a new делать в main().
так подходит? |
| Автор: chipset 3.4.2005, 10:07 | ||||
Таким образом юзаются шаблоны и ты можешь задавать любой класс, что в некотором роде и плохо.. |
| Автор: uvsoft 3.4.2005, 10:38 |
| спасиба за ответы! но тут небольшая проблемка... если использовать вариант chipset'a, то действительно можно через шаблон создать объект любого класса, что неправильно, ведь SYSTEM должен быть уверен в том, что pobj является наследником OBJECT, для того, чтобы использовать его функциональную часть... Варианты Daevaorn'a и Artiom'а не подходят, потому что только SYSTEM знает какие именно параметры нужно передавать в конструктор OBJECT, то есть в SYSTEM инкапулирована какая-нить инфа, необходимая для создания OBJECT, например, он передает указательно на себя (на владельца), какие-то начальные параметры, зависящие от текущего состояния SYSTEM... |
| Автор: Artiom 3.4.2005, 10:40 | ||
| chipset Почему плохо? А то я подумал у себя так сделать. только поэтому?
|
| Автор: uvsoft 3.4.2005, 11:00 | ||||||
ну, например, я сделаю так:
И что тогда получается?
|
| Автор: chipset 3.4.2005, 11:01 | ||
Ага. ... Можно в принципе проверять в рантайме на соответствие OBJECT. Но даже если ты вызовешь функцию которой нету в темплейте, компилятор будут материться, так что ничего страшного нету. |
| Автор: uvsoft 3.4.2005, 11:03 | ||
плз, чиркани пару строчек... |
| Автор: chipset 3.4.2005, 11:08 |
| http://vingrad.ru/CPP-MAIN-002405. |
| Автор: Void 3.4.2005, 12:30 | ||||
В принципе, можно соорудить и compile-time проверку - при помощи boost::enable_if и type_traits. Это будет выглядеть примерно так:
|
| Автор: uvsoft 3.4.2005, 13:04 | ||
Что-то я тут сильно намудрил, и ничего не клеится...
|
| Автор: uvsoft 3.4.2005, 13:26 |
| |
| Автор: chipset 3.4.2005, 13:35 |
| А ты скажи как именно не работает. Я что, похож на компилятор? |
| Автор: uvsoft 3.4.2005, 14:00 |
| использую VC++. выдает вот это: test_it error LNK2001: unresolved external symbol "public: virtual void __thiscall objectt::doit(void)" (?doit@objectt@@UAEXXZ) |
| Автор: chipset 3.4.2005, 14:16 | ||
| Припиши "{}" к функции doit класса object. Вот так:
|
| Автор: pablo 4.4.2005, 08:11 |
| Параметры "отца" при наследовании указываются после двоеточия через запятую при создании "сына" обычно в констрыкторе по умолчанию(default constructor). Не надо сдесь юзать шаблонов, они только вводят в заблуждение и не отражают суть наследования. |
| Автор: chipset 4.4.2005, 09:24 | ||
Прочитай ещё раз вопрос. uvsoft'у нужно имя типа который нужен создавать, эдакий паттерн "фабрика". |
| Автор: pablo 4.4.2005, 09:33 |
| ааааааа, сорри за офтопик. |
| Автор: maxim1000 4.4.2005, 11:45 | ||||
ну и в чем проблема его создать?
в наследниках тоже реализуется такая функция, только создавать она будет объекты нужных классов а в конструктор SYSTEM передавать адрес создающей функции... |
| Автор: uvsoft 4.4.2005, 21:30 | ||
maxim1000 я бы может так и сделал, чтобы не мучаться с шаблонами, но:
|
| Автор: chipset 5.4.2005, 01:29 |
| uvsoft, так чем мой вариант не подходит? |
| Автор: Vyacheslav 5.4.2005, 07:55 |
| Паттерны Фабрика классов, Виртуальный конструктор Одно из решений на pure C++ http://forum.vingrad.ru/index.php?showtopic=9713&view=findpost&p=60738 |
| Автор: maxim1000 5.4.2005, 10:11 | ||
да пожалуйста я написал для примера функцию без параметров, можно туда добавить и сколько угодно, а она будет их просто транслировать в конструктор если сильно захочется, можно даже будет анализировать параметры и вызывать разные конструкторы... |
| Автор: EvgenZ 16.1.2007, 11:52 | ||
Всем привет, а как можно сделать виртуальный конструктор в абстрактном классе
как сделать, если класс Point сделать абстрактным? |
| Автор: Daevaorn 16.1.2007, 12:07 |
Виртуальных конструкторов чистом виде не бывает. Бъясни что ты хочешь сделать. |
| Автор: EvgenZ 16.1.2007, 12:44 | ||
| Надо сделать виртуальные конструкторы как-то так:
я думал сделать static Point* clone(){return new Point} static Point* clone(){return new Krug} static Point* clone(){return new Kvadrat} но что-то не заладилось ))) |
| Автор: EvgenZ 17.1.2007, 00:51 |
| ап |
| Автор: Daevaorn 17.1.2007, 00:56 |
что именно? идея у тебя правильная |
| Автор: EvgenZ 17.1.2007, 10:21 |
| Daevaorn, значит можно только так? Без virtual ? Я подумал, что можно сделать по другому... |
| Автор: EvgenZ 18.1.2007, 10:48 | ||
Daevaorn, так штука в том, что класс Point хочу сделать абстрактным, тогда что я должен возвращать?
сделал функцию принт чисто виртуальной. |
| Автор: Daevaorn 18.1.2007, 11:10 |
не делай. тут надо выбирать, в зависимости от результата который хочешь получить |
| Автор: EvgenZ 18.1.2007, 11:28 |
| Я хочу получить 2 класса наследника от абстактного класса Point с виртуальными конструкторами - это можно или это невозможно? Если это возможно, то как |
| Автор: SerpentVV 7.2.2007, 18:26 |
| Непосредственно в С++ виртуальные конструкторы отсутствуют... Но есть паттерн, который называется именно так... Второе название - фабрика объектов... Еще можно поискать по словам "производящие функции" - так Элджер их называет... Или make-функции... |
| Автор: EvgenZ 8.2.2007, 10:19 |
| Как я понял в абстрактном классе их реализовать не получится. Поэтому пришлось убрать абстракность. |
| Автор: Vyacheslav 8.2.2007, 11:09 | ||
И что? Никто не мешает возвращать указатель на абстактный класс Point. |
| Автор: SerpentVV 8.2.2007, 14:15 | ||
Не, почему не удастся? все зависит от задачи и потребностей... Если класс абстрактный можно манипулировать указателями и ссылками... |