在C ++中链接一个天真的单例类的错误

时间:2012-09-11 06:33:23

标签: c++ singleton

我的代码是:

class cMySingleton{
private:
    static bool bInstantiated;
    int mInt;
    cMySingleton(){
        mInt=0;
    }
public:
    cMySingleton(int c){
        if (bInstantiated){
            cout << "you can only instantiated once";
        }
        else {
            cMySingleton();
            mInt=c;
        }
    }
};

int main () {

    cMySingleton s(5);
    cMySingleton t(6);
}

链接器一直在抱怨:

Undefined symbols for architecture x86_64:
  "cMySingleton::bInstantiated", referenced from:
      cMySingleton::cMySingleton(int) 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 ++新手在这里~~

3 个答案:

答案 0 :(得分:3)

你应该初始化静态字段。

http://ideone.com/Y1huV

#include <iostream>
class cMySingleton{
private:
    static bool bInstantiated;
    int mInt;
    cMySingleton(){
        mInt=0;
    }
public:
    cMySingleton(int c){
        if (bInstantiated){
            std::cout << "you can only instantiated once";
        }
        else {
            cMySingleton();
            mInt=c;
        }
    }
};
bool cMySingleton::bInstantiated = true;
int main () {

    cMySingleton s(5);
    cMySingleton t(6);
}

您可以在此处找到更多信息:

Static Data Member Initialization

还有缺少include和std :: around cout。

答案 1 :(得分:2)

初​​始化

static bool bInstantiated;

cMySingleton之外

bool CMySingleton::bInstantiated;

答案 2 :(得分:2)

不要忘记在.cpp文件中的类声明之外初始化静态成员:

bool cMySingleton::bInstantiated = false;