new по указателю
От: Аноним  
Дата: 17.02.04 22:03
Оценка:
всем hi!
я что то запутался в:

class C1 {};
class C2 : public C1 {};

C1 * GetNew (const C1 * pntC) {
    //тут нужно создать объект класса C1 или C2 и вернуть из функции
    //под создать подразумеваю "создать копию того объекта, который пришел в параметре"
}


т.е. я даже не представляю как подойти к решению, помогите чем сможете
Re: new по указателю
От: Анатолий Широков СССР  
Дата: 17.02.04 22:10
Оценка:
class C1
{
public:
    virtual ~C1() {}    
    virtual C1* clone() const
    {
        return new C1(*this);
    }
};

class C2 : public C1
{
public:
    virtual C1* clone() const
    {
        return new C2(*this);
    }
};

inline C1* clone(const C1 *ptr)
{
     return ptr->clone();
}

int main()
{
     C1* c1 = new C1;
     C2* c2 = new C2;
     
     C1* clone1 = clone(c1);
     C1* clone2 = clone(c2);

     delete clone1;
     delete clone2;

     delete c1;
     delete c2;

     return 0;
}
Re: new по указателю
От: MaximE Великобритания  
Дата: 17.02.04 22:12
Оценка:
>
> class C1 {};
> class C2 : public C1 {};
>
> C1 * GetNew (const C1 * pntC) {
>     //тут нужно создать объект класса C1 или C2 и вернуть из функции
>     //под создать подразумеваю "создать копию того объекта, который пришел в параметре"
> }
>

>
> т.е. я даже не представляю как подойти к решению, помогите чем сможете

Определи и реализуй каноническую ф-цию-член clone (prototype pattern). Можешь также сделать поиск по форуму по слову clone.

--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Posted via RSDN NNTP Server 1.8 beta
Re[2]: new по указателю
От: Bell Россия  
Дата: 18.02.04 07:19
Оценка: 6 (1)
Здравствуйте, Анатолий Широков, Вы писали:

Мож тогда лучше так?

АШ>
АШ>class C2 : public C1
АШ>{
АШ>public:
АШ>    virtual C2* clone() const
АШ>    {
АШ>        return new C2(*this);
АШ>    }
АШ>};
АШ>


Надо ведь уважать людей, которые добились введения ковариантных типов возвращаемых значений
Любите книгу — источник знаний (с) М.Горький
Re[3]: new по указателю
От: Анатолий Широков СССР  
Дата: 18.02.04 08:38
Оценка:
B>Надо ведь уважать людей, которые добились введения ковариантных типов возвращаемых значений

Да я не против. Причем это закреплено стандартом. Только, что делать с компиляторами, которые этого не понимают? Условную компиляцию?

class C2 : public C1
{
public:
#ifndef COVARIANT_IS_NOT_SUPPORTED
    virtual C2* clone() const
#else
    virtual C1* clone() const
#endif
    {
        return new C2(*this);
    }
};


Но вряд ли вышколенные примеры, изобилующие деталями, прольют свет на идеи, которые интересовали Анонима, ИМХО.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.