Почему происходит сбой класса друга при вызове статической функции? - PullRequest
1 голос
/ 12 июля 2011
#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/ происходит сбой программы.Это ошибка компилятора или мне нужно больше узнать о классах друзей?

Ответы [ 5 ]

6 голосов
/ 12 июля 2011

Вы создали бесконечную рекурсию:

void privateFunc(){privateFunc();};

Вместо этого используйте:

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

Нет ничего плохого в объявлении друга.

2 голосов
/ 12 июля 2011

Это сбой из-за переполнения стека, вы должны были бы разрешить область видимости для вызова статической функции

class CFriend
{
public:

   void privateFunc(){CClass::privateFunc();};
};
2 голосов
/ 12 июля 2011

Бесконечная рекурсия в вашем объекте, создающая Переполнение стека !!!

Вы должны явно позвонить классу своего друга:

void privateFunc(){CClass::privateFunc();};
2 голосов
/ 12 июля 2011

У вас также есть функция privateFunc() в классе CFriend.Это означает, что когда внутри этой функции вы вызываете privateFunc(), она будет вызывать себя (откуда она должна знать, что вы имеете в виду другой класс), таким образом входя в рекурсивный бесконечный цикл.

Вы имеете в виду

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

используя CClass::, чтобы полностью указать название функции, которую вы имеете в виду.

1 голос
/ 12 июля 2011

У вас переполнение стека из бесконечно рекурсивной функции. CFriend :: privateFunc вызывает себя. Измените его на void privateFunc() {CClass::privateFunc();}

Различия в области видимости: общедоступный, частный, защищенный и дружественный, не имеют никаких последствий во время выполнения. Они должны решать, что законно или нет, составителю. Вы можете #define private public, и полученный исполняемый файл не изменится.

...