Как копировать класс, содержащий указатель на интерфейс?
От: whirlwind_t  
Дата: 18.07.06 09:30
Оценка:
Например,
class A {
public:
  virtual void foo() = 0;
};

class B {
public:
  A* a;
};


Как написать конструктор копирования для B, чтобы каждый класс B владем своим экземпляром наследника A? Ведь мы не знаем, что будет наследоваться от A...
Re: Как копировать класс, содержащий указатель на интерфейс?
От: LuciferMoscow Россия  
Дата: 18.07.06 09:34
Оценка:
Здравствуйте, whirlwind_t, Вы писали:

_>Например,

_>
_>class A {
_>public:
_>  virtual void foo() = 0;
_>};

_>class B {
_>public:
_>  A* a;
_>};
_>


_>Как написать конструктор копирования для B, чтобы каждый класс B владем своим экземпляром наследника A? Ведь мы не знаем, что будет наследоваться от A...

Либо:

class B {
public:
boost::shared_ptr<A> a;
};

либо

B::B( const B& b)
{
  a=b.a->Clone();
}


В зависимости от того какое копирование больше подходит
Re: Как копировать класс, содержащий указатель на интерфейс?
От: zaufi Земля  
Дата: 18.07.06 09:34
Оценка:
Здравствуйте, whirlwind_t, Вы писали:

_>Например,

_>
_>class A {
_>public:
_>  virtual void foo() = 0;
_>};

_>class B {
_>public:
_>  A* a;
_>};
_>


_>Как написать конструктор копирования для B, чтобы каждый класс B владем своим экземпляром наследника A? Ведь мы не знаем, что будет наследоваться от A...


сделать в A метод A* clone() и вызывать его из нужного тебе конструктора
Re: Как копировать класс, содержащий указатель на интерфейс?
От: Viper_Craft  
Дата: 18.07.06 09:35
Оценка:
Здравствуйте, whirlwind_t, Вы писали:

_>Например,

_>
_>class A {
_>public:
_>  virtual void foo() = 0;
_>};

_>class B {
_>public:
_>  A* a;
_>};
_>


_>Как написать конструктор копирования для B, чтобы каждый класс B владем своим экземпляром наследника A? Ведь мы не знаем, что будет наследоваться от A...



Через "виртуальный конструктор"...

struct A
{
virtual foo() = 0;
virtual A* clone() const = 0;
};

class B
{
A *a;
public:
...
B( const B& b ) : a(b.a->clone()) {}
...
};
Re[2]: Как копировать класс, содержащий указатель на интерфе
От: whirlwind_t  
Дата: 18.07.06 09:40
Оценка:
Здравствуйте, Viper_Craft, Вы писали:

V_C>Здравствуйте, whirlwind_t, Вы писали:


_>>Например,

_>>
_>>class A {
_>>public:
_>>  virtual void foo() = 0;
_>>};

_>>class B {
_>>public:
_>>  A* a;
_>>};
_>>


_>>Как написать конструктор копирования для B, чтобы каждый класс B владем своим экземпляром наследника A? Ведь мы не знаем, что будет наследоваться от A...



V_C>Через "виртуальный конструктор"...


V_C>struct A

V_C>{
V_C> virtual foo() = 0;
V_C> virtual A* clone() const = 0;
V_C>};

V_C>class B

V_C>{
V_C>A *a;
V_C>public:
V_C>...
V_C>B( const B& b ) : a(b.a->clone()) {}
V_C>...
V_C>};

Понял, спасибо. как-то я сам не догадался?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.