Модераторы: 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   Вверх
chipset
Дата 3.4.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Припиши "{}" к функции doit класса object.
Вот так:
Код

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



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

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



Параметры "отца" при наследовании указываются после двоеточия через запятую при создании "сына" обычно в констрыкторе по умолчанию(default constructor). Не надо сдесь юзать шаблонов, они только вводят в заблуждение и не отражают суть наследования.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
chipset
Дата 4.4.2005, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(pablo @ 3.4.2005, 22:11)
Параметры "отца" при наследовании указываются после двоеточия через запятую при создании "сына" обычно в констрыкторе по умолчанию(default constructor).

Прочитай ещё раз вопрос. uvsoft'у нужно имя типа который нужен создавать, эдакий паттерн "фабрика".


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

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



ааааааа, сорри за офтопик. smile


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
maxim1000
Дата 4.4.2005, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
эдакий паттерн "фабрика".

ну и в чем проблема его создать?
Код

class Object
{
  static Object *CreateNew()
  {
    return new Object;
  }
}

в наследниках тоже реализуется такая функция, только создавать она будет объекты нужных классов
а в конструктор SYSTEM передавать адрес создающей функции...


--------------------
qqq
PM WWW   Вверх
uvsoft
Дата 4.4.2005, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



maxim1000 я бы может так и сделал, чтобы не мучаться с шаблонами, но:
Цитата
только SYSTEM знает какие именно параметры нужно передавать в конструктор OBJECT, то есть в SYSTEM инкапулирована какая-нить инфа, необходимая для создания OBJECT, например, он передает указательно на себя (на владельца), какие-то начальные параметры, зависящие от текущего состояния SYSTEM

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


Эксперт
****


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

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



uvsoft, так чем мой вариант не подходит?


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


Эксперт
****


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

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



Паттерны Фабрика классов, Виртуальный конструктор
Одно из решений на pure C++
http://forum.vingrad.ru/index.php?showtopi...indpost&p=60738


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 5.4.2005, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
только SYSTEM знает какие именно параметры нужно передавать в конструктор OBJECT

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


--------------------
qqq
PM WWW   Вверх
EvgenZ
Дата 16.1.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Всем привет, а как можно сделать виртуальный конструктор в абстрактном классе
Код

#include <iostream>

class Point{
public:
    Point(): mX(0.0), mY(0.0){}
    Point(float x,float y): mX(x), mY(y){}
    virtual ~Point(){}
    virtual Point* clone()const {return new Point;}
    friend std::ostream& operator<< (std::ostream&, const Point&) ;
protected:
    virtual void Print(std::ostream&) const;
    float mX;
    float mY;
};

std::ostream& operator<< (std::ostream& out, const Point& p) {
    p.Print(out);
    return out;
}

void Point::Print(std::ostream& out) const {
    out << "X= " << mX << "  Y= " << mY;
}


class Krug: public Point{
public:
    Krug(): Point(0.0, 0.0), mRad(0.0){}
    Krug(float x, float y, float rad): Point(x, y), mRad(rad){}
    ~Krug(){}
    Krug* clone()const {return new(Krug);}
protected:
    float mRad;
    void Print(std::ostream&) const;
};

void Krug::Print(std::ostream& out) const{
    Point::Print(out);
    out << "\nradius= " << mRad;
}

class Kvadrat: public Point{
public:
    Kvadrat(): Point(0.0, 0.0), mShir(0.0), mDlinna(0.0){}
    Kvadrat(float x, float y, float dl, float sh): Point(x, y), mShir(sh), mDlinna(dl){}
    ~Kvadrat(){}
    Kvadrat* clone()const {return new(Kvadrat);}
protected:
    void Print(std::ostream&) const;
    float mShir;
    float mDlinna;
};

void Kvadrat::Print(std::ostream& out) const{
    Point::Print(out);
    out << "\nShirina= " << mShir << "  Dlinna= " << mDlinna << std::endl;
}


int main(){
    Krug a(1,2,3);
    std::cout << a;
    return 0;
}


как сделать, если класс Point сделать абстрактным?


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Daevaorn
Дата 16.1.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(EvgenZ @  16.1.2007,  12:52 Найти цитируемый пост)
 сделать виртуальный конструктор в абстрактном классе

Виртуальных конструкторов чистом виде не бывает. Бъясни что ты хочешь сделать.
PM MAIL WWW   Вверх
EvgenZ
Дата 16.1.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Надо сделать виртуальные конструкторы

как-то так:

Цитата

Разработать и реализовать класс "множество" элементы которого содержат порядковые номера элементов и указатель на экземпляр класса "прямоугольник" или "окружность". Память под элементы выделяеться статически.
Для класса множества предусмотреть необходимые конструкторы, включение нового элемента (с помощью перегруженного оператора +=, в множество включаеться копия аргумента, считаеться что все элементы множества различные ) и вывод множества в поток (с помощью перегруженного оператора << ).
Окружность задаеться координатами центра и радиусом (тип float). Прямоугольник задаеться координатами левого верхнего и сторонами - длинна и ширина(тип float).
Для классов "прямоугольник" и "окружность" предусмотреть необходимые конструкторы и виртуальные методы создающии копии и выводящии в поток (с использованием перегруженного оператора <<).
Привести примеры использования разработанного класса.


я думал сделать static Point* clone(){return new Point}
                           static Point* clone(){return new Krug}
                           static Point* clone(){return new Kvadrat}
но что-то не заладилось )))


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
EvgenZ
Дата 17.1.2007, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



ап


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Daevaorn
Дата 17.1.2007, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(EvgenZ @  16.1.2007,  13:44 Найти цитируемый пост)
но что-то не заладилось ))) 

что именно? идея у тебя правильная
PM MAIL WWW   Вверх
EvgenZ
Дата 17.1.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Daevaorn, значит можно только так? Без virtual ? Я подумал, что можно сделать по другому...


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Daevaorn
Дата 17.1.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(EvgenZ @  17.1.2007,  11:21 Найти цитируемый пост)
значит можно только так? Без virtual ? Я подумал, что можно сделать по другому... 

Я же сказал только про идею. Конечно, надо static заменить на virtual.
PM MAIL WWW   Вверх
EvgenZ
Дата 18.1.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Daevaorn, так штука в том, что класс Point хочу сделать абстрактным, тогда что я должен возвращать? 

Цитата

error C2259: 'Point' : cannot instantiate abstract class
        due to following members:
        'void Point::Print(std::ostream &) const' : is abstract

сделал функцию принт чисто виртуальной.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Daevaorn
Дата 18.1.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(EvgenZ @  18.1.2007,  11:48 Найти цитируемый пост)
сделал функцию принт чисто виртуальной. 

не делай. тут надо выбирать, в зависимости от результата который хочешь получить
PM MAIL WWW   Вверх
EvgenZ
Дата 18.1.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Я хочу получить 2 класса наследника от абстактного класса Point с виртуальными конструкторами - это можно или это невозможно? Если это возможно, то как  smile ? В принципе в задании этого не говориться, но мне интересно для себя.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
SerpentVV
Дата 7.2.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Непосредственно в С++ виртуальные конструкторы отсутствуют... Но есть паттерн, который называется именно так... Второе название - фабрика объектов... 
Еще можно поискать по словам "производящие функции" - так Элджер их называет... Или make-функции...

PM MAIL   Вверх
EvgenZ
Дата 8.2.2007, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


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

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



Как я понял в абстрактном классе их реализовать не получится. Поэтому пришлось убрать абстракность.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Vyacheslav
Дата 8.2.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(EvgenZ @  18.1.2007,  10:48 Найти цитируемый пост)
Daevaorn, так штука в том, что класс Point хочу сделать абстрактным, тогда что я должен возвращать? 

И что? Никто не мешает возвращать указатель на абстактный класс  Point.



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
SerpentVV
Дата 8.2.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Цитата(EvgenZ @ 8.2.2007,  10:19)
Как я понял в абстрактном классе их реализовать не получится. Поэтому пришлось убрать абстракность.

Не, почему не удастся? все зависит от задачи и потребностей...
Если класс абстрактный можно манипулировать указателями и ссылками...

PM MAIL   Вверх
Страницы: (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.1196 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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