Quick n Dirty
Quick n Dirty

Reputation: 569

namespace in static functions

I want to write a little Singleton class that looks like:

#include <vector>

class Interpreter {

private:
    static Interpreter* interInstance;
    Interpreter() {}

public:
    static Interpreter* getInstance();
    ~Interpreter() {}

};

Interpreter* Interpreter::interInstance = 0;

Interpreter* Interpreter::getInstance(){
if (!interInstance)
    interInstance = new Interpreter();

return interInstance;
}

But this will produce this exception:

multiple definition of `Interpreter::getInstance()

This error can be corrected by wrapping the class and the function in one namespace. But I don't really understand why I need a namespace. There is one declaration of getInstance() and one implementation, no?

Upvotes: 1

Views: 190

Answers (1)

Luchian Grigore
Luchian Grigore

Reputation: 258638

Move the definition outside the header, in an implementation file, for both the member initialization and the method:

Interpreter.h

class Interpreter {

private:
    static Interpreter* interInstance;
    Interpreter() {}

public:
    static Interpreter* getInstance();
    ~Interpreter() {}

};

Interpreter.cpp

#include "Interpreter.h"
Interpreter* Interpreter::interInstance = 0;

Interpreter* Interpreter::getInstance(){
if (!interInstance)
    interInstance = new Interpreter();

return interInstance;
}

Inside a class or struct definition, static doesn't give symbols internal linkage as it does outside, so you're breaking the one definition rule.

If multiple translation units include a header that contains non-inline methods or define the same symbol, you'll run into multiple definition.

Upvotes: 2

Related Questions