不能访问公共静态变量成员

Cannot access public static variable member

本文关键字:变量 成员 静态 访问 不能      更新时间:2023-10-16

我声明了一个公共静态成员来保存我的类的实例总数。代码如下:

class Hello {
public:
    static int myCount;
    void test(){
        //do nothing
    };
    Hello(){
        Hello::myCount += 1;
    };
    ~Hello() {
        Hello::myCount -= 1;
    }
};
int main(int argc, const char * argv[]) {
    // insert code here...
    Hello *p1 = new Hello();p1->test();
    Hello *p2 = new Hello();p2->test();
    cout << Hello::myCount;
    return 0;
}

然而,当编译时,它说:

Undefined symbols for architecture x86_64:
  "Hello::myCount", referenced from:
      _main in main.o
      Hello::Hello() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我不知道我错在哪里。从我上次使用c++到现在已经很多年了,所以你能给我一个解决方案吗?谢谢你。

静态成员必须在类之外定义,例如:

class Hello {
public:
    static int myCount;
    void test(){
        //do nothing
    };
    Hello(){
        Hello::myCount += 1;
    };
    ~Hello() {
        Hello::myCount -= 1;
    }
};
int Hello::myCount = 0; // definition outside of the class
(...)

这里有一个例子来说明,它有助于解决你的问题:http://ideone.com/LVXVCc

这都是因为有一条规则叫做One Definition rule
你可以在静态类成员的上下文中阅读更多关于这个的内容。

简而言之:static int myCount声明不是成员的定义。类通常放在它们的.h/.hpp头文件中,并包含在许多其他文件中。如果这些包含静态成员,并且像上面这样的行是定义,则会导致多重定义错误。

为防止这种情况,此声明不被视为定义,您必须稍后自己定义。