/*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 правильный метод для вызова
поскольку _impl
это указатель, вы должны инициализировать его указателем:
Process::Process(ldframework::ProcessID tpid)
: _impl(new ldframework::ProcessImpl::ProcessImpl(tpid))
{ ... }
Обратите внимание на использование new
Ключевое слово в инициализации _impl
,
_impl
это указатель (PIMPL => Указатель на реализацию).
Итак, используйте new
Ключевое слово для инициализации.
Process::Process(ldframework::ProcessID tpid)
:_impl( new ldframework::ProcessImpl::ProcessImpl(tpid)) {
}
Но используйте PIMPL с smart_pointers
поэтому читайте Саттер о компиляции брандмауэров!
Ваше выражение ldframework::ProcessImpl::ProcessImpl(tpid)
оценивает, чтобы набрать ProcessImpl
, который не совпадает с типом ProcessImpl*
тип вашего члена _impl
,
Попробуйте использовать new
вместо этого в вашем списке инициализатора, и помните delete
в вашем деструкторе.
например
: _impl( new ldframework::ProcessImpl::ProcessImpl(tpid) )
и позже в вашем деструкторе
delete _impl;