1
#include <iostream>

using namespace std;

class CClass
{
private:
   friend class CFriend;
   static void privateFunc(){std::cout << "privateFunc" << std::endl;};
};

class CFriend
{
public:

   void privateFunc(){privateFunc();};
};

int main(int argc, char* argv[])
{
   CFriend b;
   b.privateFunc();
   return 0;
}

このコードはコンパイルされますが、gcc コンパイラまたはhttp://www.ideone.com/を使用すると、プログラムがクラッシュします。それはコンパイラ エラーですか、それともフレンド クラスについてもっと理解する必要がありますか?

4

5 に答える 5

6

無限再帰を作成しました:

void privateFunc(){privateFunc();};

代わりに使用してください:

void privateFunc(){CClass::privateFunc();};

フレンド宣言は問題ありません。

于 2011-07-12T13:29:17.603 に答える
2

privateFunc()CFriend クラスでも呼び出される関数があります。これは、その関数内で呼び出すprivateFunc()と、それ自体が呼び出されることを意味し(他のクラスを意味することをどのように知る必要があるか)、再帰的な無限ループに入ります。

もしかして

void privateFunc()
{
  CClass::privateFunc();
}

CClass::意味する関数の名前を完全に指定するために使用します。

于 2011-07-12T13:30:40.393 に答える
2

オブジェクトの無限再帰、スタック オーバーフローの作成!!!

フレンド クラスを明示的に呼び出す必要があります。

void privateFunc(){CClass::privateFunc();};
于 2011-07-12T13:30:59.910 に答える
2

スタックオーバーフローが原因でクラッシュしています。静的関数を呼び出すスコープ解決になります

class CFriend
{
public:

   void privateFunc(){CClass::privateFunc();};
};
于 2011-07-12T13:32:59.020 に答える
1

無限再帰関数からスタック オーバーフローが発生しました。CFriend::privateFunc は自分自身を呼び出しています。に変更しますvoid privateFunc() {CClass::privateFunc();}

public、private、protected、friend というスコープの区別は、実行時にまったく影響を与えません。それらは厳密にコンパイラが合法かどうかを決定するためのものです。可能#define private publicで、結果の実行可能ファイルは変更されません。

于 2011-07-12T13:32:18.327 に答える