2012-02-20 8 views
0

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

CImpl::SomeFunc() 
{ 

//cloning the caller class instance 

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

} 

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

+0

очень трудно ответить на вопрос, который не спросил должным образом. Проголосовал за закрытие. – Nawaz

+0

Я имею в виду, что у меня есть ситуация, когда мне нужно вызвать copyconstructor моего класса вызывающего абонента в соответствующем классе pImpl. Как мне это сделать? – Yogi

+0

Если вам нужно это сделать, ваш дизайн будет неправильным для начала. – Nawaz

ответ

2

Ну после прочтения ваших комментариев кажется, что вы хотите, чтобы у вас была возможность сделать копий из 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); 
+0

Как мне назвать этот конструктор копии из моего класса Pimpl? – Yogi

+2

@Yogi: ПОЧЕМУ ПОЧЕМУ ПОЧЕМУ? Почему вы хотите, чтобы его вызывали из класса «Pimpl»? Почему это необходимо? – Nawaz

+0

Это то, что нужно .. У меня есть все на месте. Возможно ли это как-то? Если нет, то может быть, мне нужно изменить свой дизайн. – Yogi