无法访问公共静态变量成员

时间:2016-08-26 08:41:01

标签: c++ c++11

我已声明一个公共静态成员来保留我班级实例的总数。代码如下:

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 ++开始已经好几年了,你能不能建议一个解决方案? 谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

这完全是因为一个名为一个定义规则的规则 您可以在静态类成员here的上下文中阅读有关此内容的更多信息。

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

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