4

C ++では、クラスBと友達のクラスAがあります。

Bの継承されたクラスはクラスAの友達ではないようです。

私はこれがC++の制限ですか、それとも私の間違いですか?

これが例です。コンパイルすると、「returnnewMemento」という行でエラーが発生します。

Memento :: Memento:Mementoで宣言されたプライベートメンバーにアクセスできません。

class Originator;

class Memento
{
  friend class Originator;

  Memento() {};

  int m_Data;

public:
  ~Memento() {};
};

class Originator
{
public:
  virtual Memento* createMemento() = 0;
};

class FooOriginator : public Originator
{
public:
  Memento* createMemento()
  {
    return new Memento; // Impossible to access private member of Memento
  }
};

void main()
{
  FooOriginator MyOriginator;
  MyOriginator.createMemento();

}

もちろん、FooOriginatorをMementoの友達として追加することもできますが、これは、Originatorが継承するすべてのクラスをMementoの友達として追加する必要があることを意味します。これは避けたいことです。

何か案が ?

4

5 に答える 5

7

参照:C++のフレンドスコープ
完全に重複していると投票されました。

I looks like inherited classes of B are not friend of class A.

正しい

I this a limitation of C++ or my mistake ?

これがC++の仕組みです。私はそれを制限とは見ていません。

于 2009-01-29T13:00:23.877 に答える
6

フレンドシップは継承されません。すべてのフレンド関係を明示的に宣言する必要があります。(「友情は継承されず、推移的でも相互的でもありません」も参照してください)

于 2009-01-29T09:40:29.600 に答える
3

友情は推移的でも継承されたものでもありません。結局のところ、あなたの友達の友達はあなたの友達ではないかもしれませんし、あなたの父親の友達は一般的にあなたの友達ではないかもしれません.

于 2009-01-29T17:13:28.000 に答える
0

フレンドディレクティブは、もともとカプセル化メカニズムをバイパスするための「抜け穴」として意図されていました。

フレンドでは、どのクラスがフレンドかを正確に (!) 指定する必要があります。友情は継承されないため、例ではFooOriginatorはMementoにアクセスできません。

しかし、理想的には、 friendディレクティブで問題を解決する方法を考える前に、一般的な設計を見て、 friendを使用する必要性を取り除くことをお勧めします。私たちの大好きなgotoと同じカテゴリー:)

于 2009-01-29T09:40:51.377 に答える
0

友情は継承されません。 http://www.cplusplus.com/doc/tutorial/inheritance.htmlを参照してください。基本クラスから継承されるものは何ですか?

于 2009-01-29T09:43:40.047 に答える