8

由于 C++ 中没有继承阶级友谊,那么“伪造”它的最佳方法是什么?

我正在考虑通过要继承的基类中的受保护方法公开朋友类的私有接口,但这导致必须编写(和维护)两次相同的接口。

还有其他方法吗?

4

3 回答 3

9

使用密钥是一种可能的解决方案。

这个想法是,只有拥有密钥才能解锁操作……但是一个例子价值数千字,所以让我们开始吧:

// Step 1: The key
class NeedAccess;

namespace details { class Key { friend NeedAccess; Key() {} }; }

// Step 2: NeedAccess
class NeedAccess
{
protected:
  static details::Key GetKey() { return details::Key(); }
};

// Step 3: The big one
class BigOne
{
public:
  void lockedMethod(details::Key);
};

密钥是否可复制的问题有待讨论。我看不出你能通过阻止它获得什么。

另一个好处是您可以拥有多个密钥,具体取决于您要访问的方法,这样您就可以授予“部分”友谊,并且您的“部分”朋友不能乱搞您的私人部分,尽管这是著名的声明!

编辑

这种方法称为有限友谊,并在comp.lang.c++.moderated上进行了讨论。

与Private Interface相比,此方法的主要优点是松耦合,因为只需要前向声明。

于 2009-11-05T15:52:05.813 回答
2

有友谊的班级的孩子需要请那里的父母为他们做访问。

class CrustyNeighbour
{
    private:
       friend class Bob;
       void useWiFi(std::string const& data);
};

class Bob
{
    protected:
        useWifi(CrustyNeighbour& neighbour,std::string const& data)
        {  neighbour.useWiFi(data);}
};

class Mary: public Bob // Bob's offspring
{
     void playHalo(WifiOwner& owner) // WifiOwner derived from CrustyNeighbour
     {
         useWifi(owner,gameData);  // use wifi via his/her parent who access to eighbours wifi
     }
};
于 2009-11-05T17:15:54.060 回答
0

不确定这是否不是您已经在考虑的,但这是一个虚拟朋友示例

于 2009-11-05T15:56:44.687 回答