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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование классов 
:(
    Опции темы
uvsoft
  Дата 2.4.2005, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Итак, есть следующий набор классов:
Код

class OBJECT {...};
class OBJECT1: public OBJECT {...};
class OBJECT2: public OBJECT {...};

class SYSTEM {
  OBJECT *pobj;
public:
  SYSTEM(...?...)
  {
    pobj = new OBJECT1...?...2(...);
  }
};


Подскажите, что необходимо передать в конструктор класса SYSTEM, чтобы сказать ему какой именно производный класс от OBJECT необходимо истользовать для инициализации указателя pobj. Т.е. грубо говоря есть куча потомков, чисто которых постоянно увеличивается и чтобы истользовать вновь созданного потомка достаточно изменить где-то в main одну строчку:

Код

void main()
{
  SYSTEM *stm = new SYSTEM(...?...);
}


Сопоставлять каждому потомку какай-нибудь идентификатор и проверять потом НЕ ПОЙДЕТ:
Код

SYSTEM::SYSTEM(int id)
{
  switch (id){
   case 1: pobj = new OBJECT1(...);
   .....
   case 10: pobj = new OBJECT10(...);
}

Хочется чего-нибудь универсального
М
 
Используем теги [code=cpp][/code].
Спасибо.
Chipset.



Это сообщение отредактировал(а) chipset - 3.4.2005, 10:08
--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
Daevaorn
Дата 2.4.2005, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Сделай конструктор класса SYSTEM с параметром типа OBJECT *
тогда вот тебе как вариант:
Код

void main()
{
SYSTEM *stm = new SYSTEM( new OBJECT1(...) );
}

PM MAIL WWW   Вверх
Artiom
Дата 3.4.2005, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

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



Код

SYSTEM(OBJECT* ptr)
{
pobj = ptr;

}

a new делать в main().
Код

oid main()
{
OBJECT1*  p1 = new OBJECT1();
SYSTEM *stm = new SYSTEM(p1);
}

так подходит?


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
chipset
Дата 3.4.2005, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Код

template<class T> class SYSTEM {
OBJECT *pobj;
public:
SYSTEM()
{
pobj = new T();
}
};

Код

//main.cpp
int main()
{
 SYSTEM<OBJECT2/*к примеру*/> *system = new SYSTEM();
 return 1;
}

Таким образом юзаются шаблоны и ты можешь задавать любой класс, что в некотором роде и плохо..


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
uvsoft
Дата 3.4.2005, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасиба за ответы!

но тут небольшая проблемка... если использовать вариант chipset'a, то действительно можно через шаблон создать объект любого класса, что неправильно, ведь SYSTEM должен быть уверен в том, что pobj является наследником OBJECT, для того, чтобы использовать его функциональную часть... Варианты Daevaorn'a и Artiom'а не подходят, потому что только SYSTEM знает какие именно параметры нужно передавать в конструктор OBJECT, то есть в SYSTEM инкапулирована какая-нить инфа, необходимая для создания OBJECT, например, он передает указательно на себя (на владельца), какие-то начальные параметры, зависящие от текущего состояния SYSTEM...
--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
Artiom
Дата 3.4.2005, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

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



chipset Почему плохо? А то я подумал у себя так сделать.
только поэтому?
Цитата
ведь SYSTEM должен быть уверен в том, что pobj является наследником OBJECT, для того, чтобы использовать его функциональную часть...


Это сообщение отредактировал(а) Artiom - 3.4.2005, 10:44


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
uvsoft
Дата 3.4.2005, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
chipset Почему плохо?


ну, например, я сделаю так:
Код

//main.cpp    
int main()    
{    
 SYSTEM<int> *system = new SYSTEM();    
 return 1;    
}


И что тогда получается?

Код

class OBJECT {
public:
  void doit();
};

template<class T> SYSTEM {
public:
  SYSTEM()
  {
    pobj = new T(...);

    //!!!
    pobj->doit();
    //!!!
  }
private:
  T *pobj;
};
[s]
--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
chipset
Дата 3.4.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(Artiom @ 2.4.2005, 23:40)
только поэтому?

Ага.
...
Можно в принципе проверять в рантайме на соответствие OBJECT.
Но даже если ты вызовешь функцию которой нету в темплейте, компилятор будут материться, так что ничего страшного нету.

Это сообщение отредактировал(а) chipset - 3.4.2005, 11:02


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
uvsoft
Дата 3.4.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Можно в принципе проверять в рантайме на соответствие OBJECT.


плз, чиркани пару строчек...
--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
chipset
Дата 3.4.2005, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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





--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Void
Дата 3.4.2005, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(uvsoft @ 3.4.2005, 10:38)
но тут небольшая проблемка... если использовать вариант chipset'a, то действительно можно через шаблон создать объект любого класса, что неправильно, ведь SYSTEM должен быть уверен в том, что pobj является наследником OBJECT, для того, чтобы использовать его функциональную часть...


В принципе, можно соорудить и compile-time проверку - при помощи boost::enable_if и type_traits. Это будет выглядеть примерно так:
Код

template <class T>
class SYSTEM {
    T *pobj;
public:
    SYSTEM() {
        pobj = new boost::enable_if<boost::is_base_and_derived<OBJECT, T>, T>::type();
    }
};



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
uvsoft
Дата 3.4.2005, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что-то я тут сильно намудрил, и ничего не клеится...

Код

#include <cstdio>
using namespace std;

template<class T> class systemm;

class objectt {
public:
    objectt(systemm<objectt> * const _owner) : owner(_owner){}
    ~objectt(){}
    virtual void doit();
protected:
    const systemm<objectt> *owner;
};


class objectt1: public objectt {
public:
    objectt1(systemm<objectt> * const _owner): objectt(_owner){}
    ~objectt1() {}
    virtual void doit()
    {
        printf("objectt1\n");
    }
};

class objectt2: public objectt {
public:
    objectt2(systemm<objectt> * const _owner): objectt(_owner){}
    ~objectt2() {}
    virtual void doit()
    {
        printf("objectt2\n");
    }
};


template<class T> class systemm {
public:
    systemm()
    {
        try {
            throw T(0);
        }
        catch (objectt)
        {
        }
        catch (...) 
        {
            printf("error\n");

        }
        obj = new T((systemm<objectt>* const)this);
        obj->doit();
    }
    ~systemm()
    {
        delete obj;
    }
private:
    T *obj;
};

void main ()
{
    systemm<objectt1> *stm = new systemm<objectt1>();
    delete stm;
}

--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
uvsoft
Дата 3.4.2005, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



smile smile smile
--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
chipset
Дата 3.4.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



А ты скажи как именно не работает.
Я что, похож на компилятор? smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
uvsoft
Дата 3.4.2005, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



использую VC++. выдает вот это: test_it error LNK2001: unresolved external symbol "public: virtual void __thiscall objectt::doit(void)" (?doit@objectt@@UAEXXZ)

--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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