1

我想写一个小单例类,看起来像:

#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()

可以通过将类和函数包装在一个命名空间中来纠正此错误。但我真的不明白为什么我需要一个命名空间。有一个 getInstance() 声明和一个实现,不是吗?

4

1 回答 1

2

将定义移到头文件之外,在实现文件中,用于成员初始化和方法:

解释器.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不会像在外部那样提供符号内部链接,因此您违反了单一定义规则

如果多个翻译单元包含一个包含非内联方法或定义相同符号的标题,您将遇到多个定义。

于 2012-05-15T19:15:53.047 回答