2017-07-31 66 views
2

我有一个私有静态变量的类。主函数应该改变变量的值,但即使我将主函数设置为类的朋友,编译器告诉我该变量是私有的,并且不能从main访问。Cpp Friend功能无法访问私有静态成员

例子:

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

的主要功能除了全局命名空间命名空间未声明。 –

回答

9

这是因为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; 
} 
2

您的friend声明会在名称空间nameA中为名为main的函数授予友谊,而不是全局main函数。

您的代码就相当于

namespace nameA 
{ 
    int main(void); 

    class classA 
    { 
     ... 
     friend int main(void); 
    }; 
} 

您需要声明main命名空间开始之前。

int main(void); 

namespace nameA 
{  
    class classA 
    { 
     ... 
     friend int main(void); 
    }; 
} 

应该工作