![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
fear |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
Каким образом можно и можно ли сохранить тип обекта внутри класса, а затем использовать этот тип для создания объекта? Информацию о типе можно получить с помощью ключевого слова typeid, но как использовать её для создания объекта?
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
зачем хранить type_info внутри класса, если можно в любой момент его получить через указатель?
Добавлено через 3 минуты и 6 секунд кстати этот код работать не будет Это сообщение отредактировал(а) Lazin - 24.3.2008, 15:56 |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
если тебе нужно работать с несколькими классами через 1 указатель, то. значит, у них есть что-то общее
приведи их к общему интерфейсу и работай |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
делаешь виртуальный базовый класс, от него делаешь сколько надо потомков, которые тебе нужно создавать.
потом делаешь функцию которая в качестве аргумента принимает какой нить идентификатор(например имя нужного тебе класса), затем в функции ставишь несколько if'ов(switch как вариант с целыми), и возвращаешь new objClassName, который в данный момент необходим. p.s тип возвращаемого значения ф-ии это указатель на базовый класс |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Хочешь странного. Скорее всего, нельзя. Можно создать указатель на "эталлонный объект" (предварительно создав его), а потом клонировать. Это, кстати, в "Паттернах проектирования" есть, почитай. |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
fear |
|
||||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
через какой указатель? класс имеет тип А и нетипизированный указатель Добавлено через 1 минуту и 18 секунд
если бы код работал, этой темы не существовало бы... Добавлено через 4 минуты и 8 секунд
Alek86, vinter интересен случай когда, передаваемые в класс объекты ни как не связаны Добавлено через 6 минут и 19 секунд
хочу получить QVariant (Qt) только средствами стандартной библиотеки Добавлено через 8 минут и 35 секунд
и как это сделать? |
||||||||||
|
|||||||||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
не Это ли тебе нужно? Это сообщение отредактировал(а) Alek86 - 24.3.2008, 17:00 |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
fear, почитай что-нибудь про паттерн "фабрика".
Sample code:
Ессно, что разумнее регистрировать продукты на этапе static initialization, но расписывать лень. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
fear |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
boost::variant значительно отличается от QVariant, к тому же интерисует реализация только средствами стандартной библиотеки |
|||
|
||||
fear |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 16.4.2006 Репутация: 1 Всего: 1 |
Если речь идёт о реализации предполагающей, что передаваемые функции setType() объекты обязаны иметь общего потомка, то это решение уже обсужлось - оно не интересно. Интересен случай, когда передаваемые функции setType() объекты не зависят друг от друга. Если же речь идёт о каком-то другом решении, будьте добры, представте фрагмент кода, он лучше любых слов поможет понять о чём идёт речь. archimed7592, меня интерисует реализация только методами стандартной библиотеки, без использования средств boost. Это сообщение отредактировал(а) fear - 25.3.2008, 01:21 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну создал ты объект а что ты потом с ним делать будешь?
а вобше чтоб создать в с++ в рантайме объект по условному имени, надо для каждого объекта иметь функцию создания и иметь словарь в котором каждому условному имени будет соответствовать нужная create-функция. |
|||
|
||||
archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Я тебе лишь идею набросал. Ну замени boost::function своим шаблонным функтором, имитирующим поведение конструктора, но это не труъ, ибо не scalable. Добавлено через 4 минуты и 12 секунд
Тебе интересен boost::any во всей своей красе. Но он не решает проблемы фабрики(он выступает лишь как контейнер): Создавать объекты ты сможешь только предопределённые(зарегистрированные), причём возвращать тебе придётся void *(ибо общего потомка у них не предполагается). -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||
|
|||||
UnrealMan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Шаблоны как раз позволяют избавиться от этого ограничения.
Это сообщение отредактировал(а) UnrealMan - 25.3.2008, 01:26 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |