gpt4 book ai didi

c++ - 带有继承的 Pimpl 成语

转载 作者:IT老高 更新时间:2023-10-28 22:22:06 27 4
gpt4 key购买 nike

我想使用 pimpl idiom 和继承。

这里是基础公共(public)类及其实现类:

class A
{
public:
A(){pAImpl = new AImpl;};
void foo(){pAImpl->foo();};
private:
AImpl* pAImpl;
};
class AImpl
{
public:
void foo(){/*do something*/};
};

并且我希望能够创建派生公共(public)类及其实现类:

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 的私有(private)的。

所以我看到了一些解决方法:

  1. 在 B 中创建 BImpl* pBImpl 成员,并使用附加的 A 构造函数 A(AImpl*) 将其传递给 A。
  2. 将pAImpl改为被保护(或添加Get函数),并在B中使用。
  3. B 不应该从 A 继承。在 B 中创建 BImpl* pBImpl 成员,并在 B 中创建 foo() 和 bar(),这将使用 pBImpl。
  4. 还有其他方法吗?

我应该选择什么?

最佳答案

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*/};
};

关于c++ - 带有继承的 Pimpl 成语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/491304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com