Почему происходит сбой класса друга при вызове статической функции?
#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
и полученный исполняемый файл не изменится.