2

我有三个班级:

  1. 使用 Pimpl 模式的数据持有者类 CDataHolder

    类 CDataHolder
    {
    上市:
      // ...
    私人的:
    朋友类 CBase;
    结构 PImpl;
    PImpl* iPimpl;
    };
    
  2. 一个基类CBase,需要访问CDataHolder中的iPImpl成员,所以是CDataHolder的友元类

    CBase 类:
    {
    受保护:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. CBase 的派生类 CDerived,它也需要访问相同的 iPimpl 成员。这里出现问题。尽管其父类是友元类,但派生类不能使用 iPimpl 成员。像这样:

    CDrived 类:公共 CBase
    {
    上市:
    无效doSth(){
       CDataHolder::Pimpl *pImpl = getDataHolderPimpl(); // 此行引发错误:
                                                         // "从 CDataHolder 非法访问受保护/私有成员 CDataHolder::PImpl"
    }
    };
    

    有很多派生类,所以每个派生类在 CDataHolder 类中放置“朋友类 CDerivedXXX”行并不是一个好方法。如何克服这个问题?有一个更好的方法吗?提前致谢。

4

2 回答 2

2

由于您已struct PImpl在 CDataHolder 类的私有部分中声明,因此只有 CDataHolder 的朋友可以访问它。你为什么不在struct PImpl公共部分或者在 CDataHolder 类之前更好地提出一个前向声明?

于 2009-05-12T03:45:42.720 回答
1

朋友(理所当然地)非常有限,不能被继承。我不想提出这个问题,但也许 A)您需要对 PImpl 或其某些方面的公共访问,或者 B)您需要 DataHolder 类为您使用 PImpl 做一些事情。

于 2009-05-12T03:52:32.803 回答