我有一个带有私有静态变量的类。 main函数应该更改变量中的值,但即使我将main函数设置为类的朋友,编译器也会告诉我该变量是私有的,不能从main访问。
示例:
ClassA.h:
namespace nameA{
class ClassA {
private:
static int varA;
public:
ClassA(){};
friend int main(void);
};
}
ClassA.cpp:
namespace nameA{
int ClassA::varA = 0;
}
主:
int main(void){
ClassA::varA = 42; //ERROR
}
我不知道"朋友"还允许访问静态成员,或者如果我必须找到另一种解决方案。
答案 0 :(得分:10)
因为ClassA中的友元函数main
位于nameA
命名空间中。
如果您想要声明位于全局范围内的int main(void)
函数,那么您应该这样做:
friend int ::main(void);
整个来源(在VS2015中编译):
int main(void);
namespace nameA {
class ClassA {
private:
static int varA;
public:
ClassA() {};
friend int ::main(void);
};
}
namespace nameA {
int ClassA::varA = 0;
}
int main(void) {
nameA::ClassA::varA = 42;
return 0;
}
答案 1 :(得分:2)
您的friend
声明会向名称空间main
中名为nameA
的函数授予友谊,而不是全局main
函数。
您的代码等同于
namespace nameA
{
int main(void);
class classA
{
...
friend int main(void);
};
}
您需要在命名空间开始之前声明main
。
int main(void);
namespace nameA
{
class classA
{
...
friend int main(void);
};
}
应该有效