lkahtz
lkahtz

Reputation: 4796

Linking error for a naive singleton class in C++

My code is:

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

The linker keeps complaining:

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)

What is going on? C++ novice here~~

Upvotes: 1

Views: 495

Answers (3)

Tutankhamen
Tutankhamen

Reputation: 3562

Dont forget to initialize your static member outside of your class declaration in .cpp file:

bool cMySingleton::bInstantiated = false;

Upvotes: 2

CyberGuy
CyberGuy

Reputation: 2813

you should initialize static field.

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

More information you can be find here:

Static Data Member Initialization

there was also missing include and std:: around cout.

Upvotes: 3

ForEveR
ForEveR

Reputation: 55897

Initialize

static bool bInstantiated;

outside of cMySingleton

bool CMySingleton::bInstantiated;

Upvotes: 2

Related Questions