8

クラスの友情は C++ では継承されないため、それを「偽造」する最善の方法は何ですか?

継承される基本クラスの保護されたメソッドを介して、フレンド クラスのプライベート インターフェイスを公開することを考えていましたが、同じインターフェイスを 2 回記述 (および維持) する必要があります。

他の方法はありますか?

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);
};

キーがコピー構築可能であるかどうかは、議論の余地があります。それを防ぐことで何が得られるのかわかりません。

もう 1 つの利点は、アクセスしたい方法に応じて複数のキーを持つことができることです。これにより、「部分的な」友情が付与され、有名な主張にもかかわらず、「部分的な」友人はあなたのプライベートな部分をいじることができなくなります!

編集

この方法は Limited Friendship と呼ばれ、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 に答える