8

これを回避する方法はありますか:

class B;

class C { 
 public:
  C() { }
 private:
  int i;
  friend B::B();
};

class B { 
 public:
  B() { }
 private:
  int i;
  friend C::C();
};

エラーが発生します:

prog.cpp:8: error: invalid use of incomplete type ‘struct B’
prog.cpp:1: error: forward declaration of ‘struct B’
4

4 に答える 4

5

あなたはこれを行うことはできません。循環依存を削除します。

于 2011-05-28T00:16:05.090 に答える
3

IBMのドキュメントによると(私はこれが規範的ではないことを認識しています):

クラス Y は、Y のメンバーを別のクラスのフレンドとして宣言する前に定義する必要があります。

だから答えは「いいえ」だと思います。

もちろん、使用できます

friend class B;

...代わりにfriend B::B()、しかしそれはBのメンバー全員に友情を与えます. そして、おそらくあなたはすでにそれを知っていました。

于 2011-05-28T00:21:13.623 に答える
2

あなたは友情 (特定のクラスに与えられた特定のメンバー関数へのアクセス) について非常に選択的であるため、Attorney-Client Idiomが必要な場合があります。ただし、これがコンストラクターでどの程度うまく機能するかはわかりません。

于 2011-05-28T00:28:02.097 に答える
1

これは本当にばかげた考えだと思いますが、理論的には、親クラスのコンストラクターを友達にすることで、継承によってこれを実現できないでしょうか? コードは、少なくとも疑わしいかもしれませんが、コンパイルされます。

class A {
 public:
  A() { }
 private:
  int i;
};

class D {
 public:
  D() { }
 private:
  int i;
};

class B : public A {
 public:
  B() { }
 private:
  friend D::D();
};

class C : public D {
 public:
  C() { }
 private:
  friend A::A();
};
于 2011-05-28T00:32:26.143 に答える