我想用继承的pimpl习语.
这是基础公共类及其实现类:
class A { public: A(){pAImpl = new AImpl;}; void foo(){pAImpl->foo();}; private: AImpl* pAImpl; }; class AImpl { public: void foo(){/*do something*/}; };
我希望能够使用其实现类创建派生公共类:
class B : public A { public: void bar(){pAImpl->bar();}; // Can't do! pAimpl is A's private. }; class BImpl : public AImpl { public: void bar(){/*do something else*/}; };
但我不能在B中使用pAimpl,因为它是A的私有.
所以我看到一些解决方法:
在B中创建BImpl*pBImpl成员,并使用附加的A构造函数A(AImpl*)将其传递给A.
更改要保护的pAImpl(或添加Get函数),并在B中使用它.
B不应该继承自A.在B中创建BImpl*pBImpl成员,并在B中创建foo()和bar(),这将使用pBImpl.
还有其他方法吗?
我应该选择什么?
class A { public: A(bool DoNew = true){ if(DoNew) pAImpl = new AImpl; }; void foo(){pAImpl->foo();}; protected: void SetpAImpl(AImpl* pImpl) {pAImpl = pImpl;}; private: AImpl* pAImpl; }; class AImpl { public: void foo(){/*do something*/}; }; class B : public A { public: B() : A(false){ pBImpl = new BImpl; SetpAImpl(pBImpl); }; void bar(){pBImpl->bar();}; private: BImpl* pBImpl; }; class BImpl : public AImpl { public: void bar(){/*do something else*/}; };