【问题标题】:Cpp Friend function has no access to private static membersCpp Friend 函数无权访问私有静态成员
【发布时间】:2018-01-07 04:14:02
【问题描述】:

我有一个带有私有静态变量的类。主函数应该更改变量中的值,但即使我将主函数设置为类的朋友,编译器也会告诉我该变量是私有的,不能从主函数访问。

例子:

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
}

我不知道“朋友”是否也允许访问静态成员,或者我是否必须找到其他解决方案。

【问题讨论】:

  • 函数main没有在全局命名空间之外的命名空间中声明。

标签: c++


【解决方案1】:

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

    应该工作

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 2019-07-12
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2016-11-29
      相关资源
      最近更新 更多