Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2010, 23:35   #1
Clement Meyer
Новичок
Джуниор
 
Регистрация: 15.08.2010
Сообщений: 2
По умолчанию название класса из строки

Здравствуйте.
Подскажите, можно ли как-то строку преобразовать в название класса (или любого типа вообще)?
Т.е. чтобы, грубо говоря, вместо
CBaseClass* pObj;
pObj = new CDeriveClass;

можно было написать в таком духе:
string sClassName = "CDeriveClass";
CBaseClass* pObj;
pObj = new sClassName;

где CDeriveClass - производный класс от CBaseClass.
Clement Meyer вне форума Ответить с цитированием
Старый 16.08.2010, 00:08   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

интерпретацией пахнет.
я прав?
вообще скажите цель на всякий.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 16.08.2010 в 00:16.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.08.2010, 06:58   #3
como
Форумчанин
 
Регистрация: 26.07.2008
Сообщений: 116
По умолчанию

Цитата:
Сообщение от Clement Meyer Посмотреть сообщение
Здравствуйте.
Подскажите, можно ли как-то строку преобразовать в название класса (или любого типа вообще)?
Т.е. чтобы, грубо говоря, вместо
CBaseClass* pObj;
pObj = new CDeriveClass;

можно было написать в таком духе:
string sClassName = "CDeriveClass";
CBaseClass* pObj;
pObj = new sClassName;

где CDeriveClass - производный класс от CBaseClass.
Паттерн называется "фабрика". Простейшая реализация на С++:

Код:
typedef CBaseClass * (*creator_fun)();

struct named_creator
{
    char const * name;
    creator_fun creator;
};

template <typename T>
CBaseClass * create_specific_obj()
{
    return new T();
}

named_creator const creator_list[] =
{
    { "CDeriveClass", &create_specific_obj<CDeriveClass> },
    { "AnotherClass", &create_specific_obj<AnotherClass> },
    { 0, 0 },
};

CBaseClass * create_obj(char const * name)
{
    for (named_creator const * cr = creator_list; cr->name; ++cr)
    {
        if (strcmp(name, cr->name) == 0)
            return cr->creator();
    }

    return 0;
}

void myfoo()
{
    // использование
    string sClassName = "CDeriveClass";
    CBaseClass* pObj = create_obj(sClassName.c_str());
}
como вне форума Ответить с цитированием
Старый 16.08.2010, 07:29   #4
Clement Meyer
Новичок
Джуниор
 
Регистрация: 15.08.2010
Сообщений: 2
По умолчанию

Спасибо большое. Буду разбираться
А цель-то было самая банальная на самом деле была. Просто имеется допустим listbox, каждому элементу которого соответствует определенный класс, наследник от одного и того же базового. Ну т.е. выбирает пользователь строчку, или картинку, из списка, нажимает "ОК" и в этот момент должен создаваться определенный объект. Чтобы не привязываться к номерам в самом списке, хотел создать массив структур, полями которых помимо всего прочего были бы названия элементов списка и названия соответствующих классов. Можно конечно написать гирлянду switch-case, но как-то это не красиво. Вот и хотел узнать более изящное решение, да и вообщем стало интересно как такие манипуляции в c++ проделать можно можно.
Clement Meyer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти название класса процеса зная его handle? Dazz Win Api 3 16.03.2010 11:35
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54
создание класса строки в С++ patriarch Помощь студентам 2 18.09.2009 14:42