1

もしそうなら、これはどのような状況で役に立ちますか?

または(これが事実だと思います)、なぜそれが絶対に役に立たないのですか?(そのような友情によってもたらされる能力を本質的にカバーするが、より安全で漏れの少ない方法である他のアプローチは何ですか?)

そんなものが必要かと思うくらいの状況でした。最終的には、すべてのクラス メンバーを静的にする、まったく異なる設計を行いました。私はまだ興味があります。

4

3 に答える 3

3

すべての派生クラスを互いに友達にする方法はありますか?

言語は、基本クラスでこのようなものを指定するメカニズムを提供しません。基本クラスから継承するすべてのクラスでフレンド宣言を提供する必要があります。

あなたが解決しようとしている問題がわからないので、これ以上前向きなことを提案することはできません。

コメントで、あなたは次のように述べました。

私の場合、兄弟メソッドにアクセスするB必要CAありましB::foo()C::foo()。私の場合、これらのクラスはさまざまなアルゴリズムをカプセル化します (したがって、Strategy パターンが頭に浮かびます...) が、あるアルゴリズムが別のアルゴリズムのかなりの部分を使用することがあります。しかし、 は と実際には「is-a」関係を持っていないため、Cから派生させるのは正しくないように思われました。BCB

Cが と「is-a」の関係になくても、B何らかの方法C::foo()で を呼び出す必要がある場合、 が と の両方に共通のデータしか使用できないことB::foo()を示しています。その場合、コードを非メンバー関数に分解し、それをおよびから使用できるはずです。B::foo()BCB::foo()C::foo()

依存関係を次から変更します。

B::foo()
   ^
   |
C::foo()

 <some namespace>::foo()
          ^
          |
  +-------+---------+
  |                 |
B::foo()          C::foo()
于 2015-07-17T17:16:01.027 に答える
2

正確ではありませんが、 Passkey パターンfriendのいくつかのバリアントを使用してアクセスを制限できる場合があります

基本クラスで保護された内部 Passkey クラスを作成する場合。派生クラスは、パスキーをパラメーターとして要求することで、兄弟へのアクセスを制限できます。

class A {
protected:
  class Passkey {};
};

class B : public A {
public:
  void someProtectedFunction(Passkey) {};
};

class C : public A {
public:
  void somePublicFunction() {
    B b;
    b.someProtectedFunction(A::Passkey{});
  }
};

int main() {
  C c;
  c.somePublicFunction();

  B b;
  //b.someProtectedFunction(A::Passkey{});  // error: `class A::Passkey` is protected
}
于 2015-07-17T17:51:54.913 に答える