![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
46&two |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 6.2.2004 Репутация: нет Всего: нет |
Такое дело:
Есть множество классов, реализующих объекты разных предметных областей. Все классы являются потомками некоторого класса. У каждого из объектов есть список подобъектов-наследников базового класса, т.е. он может быть контейнером объектов некоторых классов. Нужно: Реализовать механизм проверки: может ли объект класса А находиться в списке подобъектов класса В. При этом введение нового класса (который может как содержать в себе объекты других классов, так и находиться в списке объектов других классов) не должно подразумевать внесение изменений в уже существующие классы. Вот такая ботва. Есть мысли? |
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Че-та я не допонял. Это наверное должно быть все в динамике, но вот мысля такая есть в статике:
|
|||
|
||||
achmed |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 12.4.2004 Репутация: нет Всего: нет |
хитро!
но это не даст ответ на вопрос является ли данный класс потомком заданого. можно посмотреть как это сделанр в MFC, например, а вообще это метапрограммирование |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Смотря в чем пишешь, если в чистом С++, то там механизм RTTI не реализован.
А реализовывать его не так просто . Тут на форуме была тема как это реализовано в MFC (при помощи статических переменных и макросов) весьма ценная статейка была. -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Чего-то я тоже непонял. Надо проверить является ли один класс потомком другого? Для этого dynamic_cast можно использовать.
-------------------- С уважением. Gray. |
|||
|
||||
46&two |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 6.2.2004 Репутация: нет Всего: нет |
нет. смысл не в том, чтобы понять, является ли класс А потомком класса В.
По большому счету, все классы в описанной задаче являются потомками одного-единственного класса (пусть будет BaseClass) Как я уже сказал, у каждого из этого множества классов есть список типа: list <BaseClass> myChildrenList; вот. Но проблема в том, что для каждого конкретного класса в этом списке могут быть экземпляры ТОЛЬКО НЕКОТОРЫХ ИЗ множества классов-потомков BaseClass. Например, есть классы A, B, C. Все они потомки BaseClass (они могут быть и непрямыми потомками, между ними могут быть отношения наследования - не суть важно). В списке myChildrenList класса A могут находиться экземпляры всех классов (A,B,C, BaseClass) У экземпляров класса B в этом списке могут быть только экземпляры B и C, а экземпляры классов А и BaseClass быть не могут. А, например, у С в списке быть не может ничего. Так вот, нужно реализовать механизм который каким-либо образом определял бы, могут ли экземпляра класса i лежать в списке экземпляра класса j. Кроме того (самое важное в данной задаче): пусть мы добавили новый класс D, экземпляры которого, по замыслу, могут находиться в списках всех классов (A,B,C,D, BaseClass). Как это дело реализовать, НИЧЕГО НЕ МЕНЯЯ В УЖЕ СУЩЕСТВУЮЩИХ КЛАССАХ (А, B, C, BaseClass)???? Да и вообще, возможно ли подобное??? |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
||||
|
||||
46&two |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 6.2.2004 Репутация: нет Всего: нет |
информация интересная, но, тем не менее, к данной задаче ни малейшего отношения не имеет.
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Для проверки "является ли один класс производным от другого класса", можно и нужно использовать RTTI. Вот рабочий код, с примерами:
Добавлено @ 17:33 З.Ы. Этот вопрос подымается довольно часто, поэтому тема добавлена в FAQ по С++. -------------------- ![]() |
|||
|
||||
achmed |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 12.4.2004 Репутация: нет Всего: нет |
не понял ? какой такой чистый C++ без RTTI ? может вы путаете со старым стандартом ? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |