1

次のような小さな Singleton クラスを書きたいと思います。

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

ただし、これにより次の例外が発生します。

multiple definition of `Interpreter::getInstance()

このエラーは、クラスと関数を 1 つの名前空間にラップすることで修正できます。しかし、名前空間が必要な理由がよくわかりません。getInstance() の 1 つの宣言と 1 つの実装がありますね。

4

1 に答える 1

2

メンバーの初期化とメソッドの両方について、実装ファイル内のヘッダーの外側に定義を移動します。

Interpreter.h

class Interpreter {

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

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

};

インタプリタ.cpp

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

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

return interInstance;
}

クラスまたは構造体定義のstatic内部では、外部と同様にシンボルに内部リンケージを与えないため、1 つの定義ルールに違反しています。

複数の翻訳単位に、インライン以外のメソッドを含むヘッダーが含まれているか、同じシンボルを定義している場合、複数の定義に遭遇します。

于 2012-05-15T19:15:53.047 に答える