3

重複の可能性:
アクセス指定子とは? プライベート、プロテクト、またはパブリックで継承する必要がありますか?

別のクラス (C++) からプライベート メソッドへのアクセスを許可するコードまたはデザイン パターンを探しています。

1 つのクラス OBJ1 があるとします。

class OBJ1
{
  public:
    void method1();
    void method2();
}

OBJ1 をインスタンス化する別のクラス OBJ2:

class OBJ2
{
  public:
    void method3()
    {
       my_obj.method1();
    }
  private:
    OBJ1 my_obj;
}

OBJ2::my_obj.method2()他のクラスからアクセスする方法はありますか(この方法のみ)?

4

5 に答える 5

2

publicなのでアクセスmethod2可能です。であるため、メンバーに直接アクセスするmy_objことはできませんprivate。他のクラスにアクセスを許可するには、 のように宣言しfriendますOBJ2

class OBJ2
{
  public:
    void method3()
    {
       my_obj.method1();
    }
  private:
    friend class X;
    OBJ1 my_obj;
}

これで、XアクセスできますOBJ2::my_obj

于 2012-10-02T13:11:37.130 に答える
1

おそらく、これを行う最善の方法は、この特定の機能にパブリック パススルー機能を提供することですmethod3

class OBJ2 
{   
     public:
         void method3()     
         {
             my_obj.method1();
         }
         void method2()
         {
             my_obj.method2();
         }
     private:
         OBJ1 my_obj; 
} 

これにより、構文が少し変更されます。含まれている OBJ1 インスタンスに対して直接ではなく、OBJ2 インスタンスに対してメソッドを呼び出していますが、その効果は要求どおりになります。

ここでのもう 1 つの考慮事項は、このタイプのイディオム (パブリック ラッパー関数) は、含まれているメンバーの単一の関数に無制限の外部アクセスを提供することです。もう 1 つのアプローチ (フレンド宣言) では、単一の外部クラスがプライベートな内部全体にアクセスできます。単一の外部クラスに単一のメンバーへのアクセスを許可することが必要な場合は、プロキシ オブジェクトなどを使用してこれらのアプローチを組み合わせる方がよい場合があります。

于 2012-10-02T13:12:46.957 に答える
1

あなたは自分自身の質問に答えました: を見てください。これは、囲んでいる class を介して呼び出すmethod3方法を提供します。へのアクセスを許可するために、同様の転送方法を追加できます。method1my_objOBJ2method2

于 2012-10-02T13:13:39.093 に答える
0

必要なのは、メンバーを呼び出すpublicメソッドです。OBJ2method2my_obj

この場合、friendship は のすべてへのアクセスを許可するため、役に立ちませんmy_obj

于 2012-10-02T13:15:07.473 に答える
0

設計の観点から、この言語はメンバーごとのアクセスを制御する機能を提供しません。それをハッキングすることはできますが、コードが複雑になり、保守が難しくなり、コンパイラーの管理が難しくなります (より複雑になります)。コードはコードの最適化が難しいことを意味します)。

そのメンバーが残りのメンバーと実際に異なり、それにアクセスするオブジェクトがオブジェクトの残りの部分にアクセスしてはならない場合、いくつかの代替手段には、インターフェイス (ポリモーフィック) を定義し、そのインターフェイスを に実装することが含まれますOBJ1。次に、他のメンバーが使用できないインターフェイスへの参照を渡すことができます。

技術的な観点から、実行できることは複数あります。たとえば、OBJ1as パラメーターを受け取り、メソッドを呼び出すアクセサー関数オブジェクトを作成できます。ファンクターは、OBJ1(他のすべてのメンバーがプライベートであると仮定して) operator()(または、ディスパッチを実行し、それをプライベートにする名前付き関数) のフレンドである必要があり、その後OBJ2、その中間ディスパッチャーとフレンドになる必要があります。

于 2012-10-02T13:31:47.197 に答える