Как вызвать конструктор копирования класса вызывающего из класса pimpl? - PullRequest
0 голосов
/ 20 февраля 2012

Мне просто нужно знать, хочу ли я вызывать свой copyconstuctor из класса pImpl, как мне это сделать?Например:

CImpl::SomeFunc()
{

//cloning the caller class instance

caller = new Caller(*this)// I cant do this since its a pImpl class

}

Как мне этого добиться?

1 Ответ

3 голосов
/ 20 февраля 2012

Ну, после прочтения ваших комментариев, кажется, вы хотите иметь возможность сделать копий класса Caller. Если это так, то в этом случае вы должны реализовать конструктор копирования для класса Caller, где вы можете сделать печатную копию указателя m_pImpl.

class CallerImpl;

class Caller
{
   std::shared_ptr<CallerImpl> m_pImpl;
public:
   Caller(Caller const & other) : m_pImpl(other.m_pImpl->Clone()) {}
   //...
};

И тогда вы можете реализовать функцию Clone() в классе CallerImpl как:

class CallerImpl
{
   public:
     CallerImpl* Clone() const
     {
         return new CallerImpl(*this); //create a copy and return it
     }
     //...
};

Теперь вы можете сделать копию Caller:

//Usage
Caller original;
Caller copy(original); 
...