2012-02-16 7 views
0

Я использую идиом pimpl в своей программе, и я застрял в одном месте. Мой кодПреобразование указателя pImpl обратно в вызывающий тип

Class* 
Class::GetP() 
{ 
return ClassImpl->GetP(); 
} 

В моих ClassImpl-> GetP() У меня есть

ClassImpl* 
ClassImpl::GetP() 
{ 
return pClassImpl; 
} 

Как вы можете видеть, что я должен преобразовать мой Pimpl BacT к моему типу вызывающего абонента. Каков путь?

Я не хочу использовать любой отливку
Пожалуйста, советы

+0

В чем причина нежелания использовать какое-либо литье? –

+0

Что означает 'GetP'? Зачем тебе это? – tzaman

+0

GetP фактически возвращает новый instancde какого-либо типа, который создается на основе параметра, переданного getP, также я могу использовать reintepret cast, но у него есть некоторые накладные расходы. Я думаю, что решение прост и мне что-то не хватает – Yogi

ответ

0

Вы бы не просто сделать

Class * 
Class::GetP() 
{ 
    return this; 
} 

, поскольку абоненты из Class::GetP() не должны иметь указатель на внутренностях в любом случае? (Но тогда, для чего этот метод? Это не дает вызывающему все, что у них еще нет.)

+0

На самом деле его больше похоже на GetP (некоторый параметр) он возвращает новый экземпляр, который построен в классе impl с использованием этого параметра – Yogi

+0

Если он возвращает новый экземпляр, вы должны создать ' новый класс "как-то и возвращая это. Таким образом, вашей функцией реализации будет 'Class * ClassImpl :: GetP (...) {...}' (обратите внимание, что тип возвращаемого значения изменился с 'ClassImpl *' на 'Class *'). –

+0

, так это нормально создать экземпляр моего вызывающего абонента в моем классе pImpl? – Yogi