2012-05-15 2 views
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() 

Эта ошибка может быть исправлена ​​путем оборачивания класса и функция в одном пространстве имен. Но я не понимаю, зачем мне пространство имен. Существует одна декларация getInstance() и одна реализация, нет?

+3

Если вы указали этот код из нескольких единиц перевода, то существует несколько реализаций 'getInstance()' и 'interInstance' –

+1

. Добавляя, вы всегда должны обертывать свои заголовки в защиту заголовка. – chris

+0

Используете ли вы анонимное пространство имен, то есть 'namespace {/ * stuff * /}'? –

ответ

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 не дает символов внутренней связи, как и снаружи, поэтому вы нарушаете одно правило определения.

Если несколько единиц перевода включают заголовок, который содержит не встроенные методы или определяет один и тот же символ, вы столкнетесь с несколькими определениями.

+0

Возможно, стоит добавить указатель на более подробное описание многих непоследовательных значений «static» на C++, но я думаю, что однострочное объяснение так же хорошо, как и любой, кто когда-либо собирается делать в одном предложение. – abarnert

Смежные вопросы