Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранение типа объекта в нетипизированном классе, или как то так :) 
V
    Опции темы
fear
Дата 24.3.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Каким образом можно и можно ли сохранить тип обекта внутри класса, а затем использовать этот тип для создания объекта? Информацию о типе можно получить с помощью ключевого слова typeid, но как использовать её для создания объекта?

Код

class A
{
  public:
    A():ptr(0) {};
    virtual ~A() {clear();};

    template<typename T>
    void setType(const T &value)
    {
      type = new typeid(value);
    }
    void make()
    {
      clear();
      /*
      создание объекта типа type
      ptr = new *type;
      */
    }
    void clear()
    {
      /*освобождение занимаемой памяти*/
    }

  private:
    type_info *type;
    void *ptr;
};

PM MAIL   Вверх
Lazin
Дата 24.3.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



зачем хранить type_info внутри класса, если можно в любой момент его получить через указатель?

Добавлено через 3 минуты и 6 секунд
кстати этот код работать не будет

Это сообщение отредактировал(а) Lazin - 24.3.2008, 15:56
PM MAIL Skype GTalk   Вверх
Alek86
Дата 24.3.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



если тебе нужно работать с несколькими классами через 1 указатель, то. значит, у них есть что-то общее
приведи их к общему интерфейсу и работай


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 24.3.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



делаешь виртуальный базовый класс, от него делаешь сколько надо потомков, которые тебе нужно создавать.
потом делаешь функцию которая в качестве аргумента принимает какой нить идентификатор(например имя нужного тебе класса), затем в функции ставишь несколько if'ов(switch как вариант с целыми), и возвращаешь new objClassName, который в данный момент необходим. 
p.s тип возвращаемого значения ф-ии это указатель на базовый класс


--------------------
Мой блог
PM MAIL WWW   Вверх
JackYF
Дата 24.3.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(fear @  24.3.2008,  14:51 Найти цитируемый пост)
а затем использовать этот тип для создания объекта? Информацию о типе можно получить с помощью ключевого слова typeid, но как использовать её для создания объекта?

Хочешь странного. Скорее всего, нельзя.
Можно создать указатель на "эталлонный объект" (предварительно создав его), а потом клонировать. Это, кстати, в "Паттернах проектирования" есть, почитай.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 24.3.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(fear @  24.3.2008,  15:51 Найти цитируемый пост)
можно ли сохранить тип обекта внутри класса, а затем использовать этот тип для создания объекта? 

Можно сохранить информацию о типе внутри объекта класса, а затем использовать эту информацию для создания объекта соответствующего типа.
PM MAIL   Вверх
fear
Дата 24.3.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Цитата(Lazin @ 24.3.2008,  15:56)
зачем хранить type_info внутри класса, если можно в любой момент его получить через указатель?

через какой указатель? класс имеет тип А и нетипизированный указатель

Добавлено через 1 минуту и 18 секунд
Цитата(Lazin @ 24.3.2008,  15:56)
кстати этот код работать не будет

если бы код работал, этой темы не существовало бы...

Добавлено через 4 минуты и 8 секунд
Цитата(Alek86 @ 24.3.2008,  16:03)
если тебе нужно работать с несколькими классами через 1 указатель, то. значит, у них есть что-то общее
приведи их к общему интерфейсу и работай

Alek86, vinter интересен случай когда, передаваемые в класс объекты ни как не связаны

Добавлено через 6 минут и 19 секунд
Цитата(JackYF @ 24.3.2008,  16:07)
Хочешь странного. Скорее всего, нельзя.

хочу получить QVariant (Qt) только средствами стандартной библиотеки

Добавлено через 8 минут и 35 секунд
Цитата(UnrealMan @ 24.3.2008,  16:30)
Можно сохранить информацию о типе внутри объекта класса, а затем использовать эту информацию для создания объекта соответствующего типа.

и как это сделать?
PM MAIL   Вверх
Alek86
Дата 24.3.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(fear @  24.3.2008,  16:41 Найти цитируемый пост)
хочу получить QVariant (Qt) только средствами стандартной библиотеки

не Это ли тебе нужно?

Это сообщение отредактировал(а) Alek86 - 24.3.2008, 17:00


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 24.3.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(fear @  24.3.2008,  16:41 Найти цитируемый пост)
и как это сделать?

С помощью шаблонов и виртуальных функций.
PM MAIL   Вверх
archimed7592
Дата 24.3.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



fear, почитай что-нибудь про паттерн "фабрика".
Sample code:
Код

class FactorySingleton
{
   template< class ProductT >
   void registerProduct(const string &type)
   {
       this->factoryMethodsMap.insert(make_pair(type, boost::funcrtion< IProduct *() >(boost::lambda::new_ptr< ProductT >())));
   }
   IProduct *createProduct(const string &type) 
   {
       FactoryMethodsMap::const_iterator it = this->factoryMethodsMap.find(type);
       if (it == this->factoryMethodsMap.end())
            return 0;
       return it->second();
   }
};

int main()
{
  FactorySingleton &factory = FactorySingleton::instance();
  factory.registerProduct< ProductA >("A");
  factory.registerProduct< ProductA >("B");
  // ...
  IProduct *a = factory.createProduct("A");
  IProduct *b = factory.createProduct("B");
  // ...
}

Ессно, что разумнее регистрировать продукты на этапе 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
PM Jabber   Вверх
fear
Дата 25.3.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Цитата(Alek86 @ 24.3.2008,  17:00)
не Это ли тебе нужно?

boost::variant значительно отличается от QVariant, к тому же интерисует реализация только средствами стандартной библиотеки
PM MAIL   Вверх
fear
Дата 25.3.2008, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Цитата(UnrealMan @ 24.3.2008,  18:35)
Цитата(fear @  24.3.2008,  16:41 Найти цитируемый пост)
и как это сделать?

С помощью шаблонов и виртуальных функций.

Если речь идёт о реализации предполагающей, что передаваемые функции setType() объекты обязаны иметь общего потомка, то это решение уже обсужлось - оно не интересно. Интересен случай, когда передаваемые функции setType() объекты не зависят друг от друга.
Если же речь идёт о каком-то другом решении, будьте добры, представте фрагмент кода, он лучше любых слов поможет понять о чём идёт речь.

archimed7592, меня интерисует реализация только методами стандартной библиотеки, без использования средств boost.

Это сообщение отредактировал(а) fear - 25.3.2008, 01:21
PM MAIL   Вверх
mes
Дата 25.3.2008, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



ну создал ты объект а что ты потом с ним делать будешь?

а вобше чтоб создать в с++ в рантайме объект по условному имени, надо для каждого объекта иметь функцию создания и иметь словарь в котором каждому условному имени будет соответствовать нужная create-функция.



--------------------
PM MAIL WWW   Вверх
archimed7592
Дата 25.3.2008, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(fear @  25.3.2008,  00:46 Найти цитируемый пост)
archimed7592 меня интерисует реализация только методами стандартной библиотеки, без использования средств boost.

Я тебе лишь идею набросал. Ну замени boost::function своим шаблонным функтором, имитирующим поведение конструктора, но это не труъ, ибо не scalable.

Добавлено через 4 минуты и 12 секунд
Цитата(fear @  25.3.2008,  00:46 Найти цитируемый пост)
Интересен случай, когда передаваемые функции setType() объекты не зависят друг от друга.

Тебе интересен boost::any во всей своей красе. Но он не решает проблемы фабрики(он выступает лишь как контейнер):
Цитата(fear @  24.3.2008,  15:51 Найти цитируемый пост)
но как использовать её для создания объекта?

Создавать объекты ты сможешь только предопределённые(зарегистрированные), причём возвращать тебе придётся 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
PM Jabber   Вверх
UnrealMan
Дата 25.3.2008, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(fear @  25.3.2008,  00:46 Найти цитируемый пост)
Если речь идёт о реализации предполагающей, что передаваемые функции setType() объекты обязаны иметь общего потомка

Шаблоны как раз позволяют избавиться от этого ограничения.

Код

struct Base
{
    virtual ~Base() {}
    virtual void Create() = 0;
};

template <class T>
    struct Derived : Base
{
    virtual void Create(); // тут создаём объект
}

int main()
{
    Base *p = new Derived<Type>; // запомнили тип
    p->Create(); // создали объект
}


Это сообщение отредактировал(а) UnrealMan - 25.3.2008, 01:26
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1314 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.