Вызов конструктора через дизайн PIMPL

/*Process.h*/
class Process  {
public:
Process(ProcessID thirdParty_pid);

protected:
void createImpl();

private:
ProcessImpl  * _impl;
};/*ProcessImpl.h*/

class ProcessImpl {
public :
ProcessImpl(ProcessID thirdParty_pid);
}

Используя идиому PIMPL теперь я пытаюсь вызвать конструктор ProcessImpl следующим образом:

Process::Process(ldframework::ProcessID tpid):_impl(ldframework::ProcessImpl::ProcessImpl(tpid)) {
}

Но я получаю следующую ошибку
ошибка: не удается преобразовать ProcessImpl в ProcessImpl * при инициализации

Пожалуйста, помогите в решении этой ошибки, а также дайте мне знать wts правильный метод для вызова

-2

Решение

поскольку _impl это указатель, вы должны инициализировать его указателем:

Process::Process(ldframework::ProcessID tpid)
: _impl(new ldframework::ProcessImpl::ProcessImpl(tpid))
{ ... }

Обратите внимание на использование new Ключевое слово в инициализации _impl,

1

Другие решения

_impl это указатель (PIMPL => Указатель на реализацию).

Итак, используйте new Ключевое слово для инициализации.

Process::Process(ldframework::ProcessID tpid)
:_impl( new ldframework::ProcessImpl::ProcessImpl(tpid)) {
}

Но используйте PIMPL с smart_pointersпоэтому читайте Саттер о компиляции брандмауэров!

1

Ваше выражение ldframework::ProcessImpl::ProcessImpl(tpid) оценивает, чтобы набрать ProcessImpl, который не совпадает с типом ProcessImpl*тип вашего члена _impl,

Попробуйте использовать new вместо этого в вашем списке инициализатора, и помните delete в вашем деструкторе.

например

: _impl( new ldframework::ProcessImpl::ProcessImpl(tpid) )

и позже в вашем деструкторе

delete _impl;
0
По вопросам рекламы [email protected]