Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Хранение типа объекта в нетипизированном классе |
Автор: fear 24.3.2008, 15:51 | ||
Каким образом можно и можно ли сохранить тип обекта внутри класса, а затем использовать этот тип для создания объекта? Информацию о типе можно получить с помощью ключевого слова typeid, но как использовать её для создания объекта?
|
Автор: Lazin 24.3.2008, 15:56 |
зачем хранить type_info внутри класса, если можно в любой момент его получить через указатель? Добавлено через 3 минуты и 6 секунд кстати этот код работать не будет |
Автор: Alek86 24.3.2008, 16:03 |
если тебе нужно работать с несколькими классами через 1 указатель, то. значит, у них есть что-то общее приведи их к общему интерфейсу и работай |
Автор: vinter 24.3.2008, 16:03 |
делаешь виртуальный базовый класс, от него делаешь сколько надо потомков, которые тебе нужно создавать. потом делаешь функцию которая в качестве аргумента принимает какой нить идентификатор(например имя нужного тебе класса), затем в функции ставишь несколько if'ов(switch как вариант с целыми), и возвращаешь new objClassName, который в данный момент необходим. p.s тип возвращаемого значения ф-ии это указатель на базовый класс |
Автор: UnrealMan 24.3.2008, 16:30 | ||
Можно сохранить информацию о типе внутри объекта класса, а затем использовать эту информацию для создания объекта соответствующего типа. |
Автор: fear 24.3.2008, 16:41 | ||||||||||
через какой указатель? класс имеет тип А и нетипизированный указатель Добавлено через 1 минуту и 18 секунд
если бы код работал, этой темы не существовало бы... Добавлено через 4 минуты и 8 секунд
Alek86, vinter интересен случай когда, передаваемые в класс объекты ни как не связаны Добавлено через 6 минут и 19 секунд
хочу получить QVariant (Qt) только средствами стандартной библиотеки Добавлено через 8 минут и 35 секунд
и как это сделать? |
Автор: Alek86 24.3.2008, 17:00 | ||
не http://www.boost.org/doc/html/variant.html ли тебе нужно? |
Автор: UnrealMan 24.3.2008, 18:35 |
С помощью шаблонов и виртуальных функций. |
Автор: archimed7592 24.3.2008, 19:30 | ||
fear, почитай что-нибудь про паттерн "фабрика". Sample code:
Ессно, что разумнее регистрировать продукты на этапе static initialization, но расписывать лень. |
Автор: fear 25.3.2008, 00:29 | ||
boost::variant значительно отличается от QVariant, к тому же интерисует реализация только средствами стандартной библиотеки |
Автор: fear 25.3.2008, 00:46 | ||
Если речь идёт о реализации предполагающей, что передаваемые функции setType() объекты обязаны иметь общего потомка, то это решение уже обсужлось - оно не интересно. Интересен случай, когда передаваемые функции setType() объекты не зависят друг от друга. Если же речь идёт о каком-то другом решении, будьте добры, представте фрагмент кода, он лучше любых слов поможет понять о чём идёт речь. archimed7592, меня интерисует реализация только методами стандартной библиотеки, без использования средств boost. |
Автор: mes 25.3.2008, 01:16 |
ну создал ты объект а что ты потом с ним делать будешь? а вобше чтоб создать в с++ в рантайме объект по условному имени, надо для каждого объекта иметь функцию создания и иметь словарь в котором каждому условному имени будет соответствовать нужная create-функция. |
Автор: archimed7592 25.3.2008, 01:17 | ||||
Я тебе лишь идею набросал. Ну замени boost::function своим шаблонным функтором, имитирующим поведение конструктора, но это не труъ, ибо не scalable. Добавлено через 4 минуты и 12 секунд
Тебе интересен boost::any во всей своей красе. Но он не решает проблемы фабрики(он выступает лишь как контейнер): Создавать объекты ты сможешь только предопределённые(зарегистрированные), причём возвращать тебе придётся void *(ибо общего потомка у них не предполагается). |
Автор: UnrealMan 25.3.2008, 01:22 | ||||
Шаблоны как раз позволяют избавиться от этого ограничения.
|
Автор: fear 25.3.2008, 01:38 | ||||||
буду использовать
и этот подход видимо - единственный... Только не укладывается в голове, почему если имеется возможность сохранить информацию о типе внутри класса, отсутствует возможность использовать непосредственно эту информацию для создания класса того же типа. |
Автор: bsa 25.3.2008, 10:41 | ||
fear
|
Автор: fear 25.3.2008, 14:31 |
bsa, как? Добавлено через 9 минут и 6 секунд UnrealMan, спасибо, такой подход решает поставленный вопрос. |
Автор: bsa 25.3.2008, 15:06 |
fear, в том то и дело, что никак. Это я к Только не укладывается в голове, почему если имеется возможность сохранить информацию о типе внутри класса, отсутствует возможность использовать непосредственно эту информацию для создания класса того же типа. Так как в данном случае информация не сохраняется. Чтобы она сохранилась, нужно сделать виртуальный деструктор (ну или другой виртуальный метод, но виртуальный деструктор в любом случае делать надо). А раз есть деструктор, то кто мешает сделать виртуальный метод clone()... Как вариант, можно фабрику замутить... |