静态函数中的命名空间

时间:2012-05-15 19:09:17

标签: c++ static namespaces

我想写一个看起来像的小单体类:

#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()声明和一个实现,没有?

1 个答案:

答案 0 :(得分:2)

在成员初始化和方法中,将定义移到实现文件的标题之外:

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

在类或结构定义中,static不会像在外部那样给出符号内部链接,因此您打破一个定义规则

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