Почему происходит сбой класса друга при вызове статической функции?

#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 ответов

Решение

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

void privateFunc(){privateFunc();};

Используйте вместо:

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

Нет ничего плохого в декларации друзей.

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

Ты имеешь в виду

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

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

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

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

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

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

class CFriend
{
public:

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

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

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

Другие вопросы по тегам