Cpp Friend功能无法访问私有静态成员

时间:2017-07-31 14:19:55

标签: c++

我有一个带有私有静态变量的类。 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
}

我不知道"朋友"还允许访问静态成员,或者如果我必须找到另一种解决方案。

2 个答案:

答案 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);
   };
}

应该有效