2012-03-07 4 views
1

У меня возникают некоторые ошибки, когда я пытаюсь поместить объявление и определение класса в файл сепаратора hpp и cpp. не могли бы вы помочь мне исправить это, пожалуйста. Я пытаюсь манипулировать синглтон так:cpp hpp separation

sing.hpp:

class GlobalClass { 
    int m_value; 
    static GlobalClass *s_instance; 
    GlobalClass(int); 

    public: 
    int get_value(); 
    void set_value(int v); 
    static GlobalClass *instance(); }; 

sing.cpp:

#include"sing.hpp" 
GlobalClass::GlobalClass(int v = 0) 
{ 
    this->m_value = v; 
} 

int GlobalClass::get_value() 
{ 
    return this->m_value; 
} 

void GlobalClass::set_value(int v) 
{ 
    this->m_value = v; 
} 

static GlobalClass GlobalClass::*instance() 
{ 
    if (!s_instance) 
     s_instance = new GlobalClass; 
    return s_instance; 
} 

main.cpp:

#include "sing.hpp" 
int main() 
{ 
    GlobalClass *s=0; 
} 

команды и погрешности:

~/workspace/singleton$ g++ main.cpp sing.cpp 
sing.cpp: In function ‘GlobalClass GlobalClass::* instance()’: 
sing.cpp:19:10: error: ‘s_instance’ was not declared in this scope 
sing.cpp:2:1: error: ‘GlobalClass::GlobalClass(int)’ is private 
sing.cpp:20:23: error: within this context 
sing.cpp:21:12: error: ‘s_instance’ was not declared in this scope 
+0

Как только вы получите рабочий синглтон, вы можете подумать над тем, является ли [хорошей идеей] (http://stackoverflow.com/questions/137975). (Хотя в этом вопросе не упоминаются конкретные трудности управления ими на C++, такие как утечка памяти и безопасность, не связанная с потоком вашего подхода.) –

ответ

3

Ваше определение instance имеет две ошибки:

  1. static классификатор является ошибочным.
  2. Синтаксис для возвращаемого типа получил скремблированный. Указатель принадлежит к типу, а не имя функции:

    GlobalClass* GlobalClass::instance() 
    { 
        if (!s_instance) 
         s_instance = new GlobalClass; 
        return s_instance; 
    } 
    

Кроме того, вы также должны определить статический член s_instance, как уже отмечалось.

GlobalClass* GlobalClass::s_instance = 0; 

Но этот код имеет другую проблему: он течет памятью. Don’t use raw pointers.

И, наконец, этот код не является потокобезопасным, и это может быть в некоторых ситуациях, если проблема огромная.Предполагая, что вы можете гарантировать, что ваш код никогда не будет будет запущен в многопоточных сценариях, продолжайте. В противном случае вы, вероятно, захотите его изменить (и кто может предложить такую ​​сильную гарантию?).

+0

«избыточные» и «ошибочные» взаимоисключающие на мой взгляд; первое подразумевает необходимость, но также и вред –

+0

Я не совсем согласен с необработанными указателями. Зачем заставить ваше приложение тратить 2 минуты на то, чтобы отключить свои синглтоны, когда у вас есть идеальный сборщик мусора - тот факт, что процесс освобождает все свои ресурсы, когда он завершается. – CashCow

+0

@ Светлый Я согласен. Изменено. –

1

Статические идентификаторы должны быть определены и объявлены.

Итак, положите s_instance в ваш sing.cpp. И я считаю, что вы должны инициализировать его NULL.

+0

Объявлено. –

+0

It * есть * указанный. Он не определен (и это еще одна ошибка), но об этом не говорится в сообщении об ошибке. –

+0

'вы не можете создать статическую переменную'. Это просто не имеет смысла. –

4
static GlobalClass GlobalClass::*instance() 
{ 
    if (!s_instance) 
     s_instance = new GlobalClass; 
    return s_instance; 
} 

Это определение не должно содержать тег static. Только декларация.

Как бы то ни было, вы фактически не определяете функцию-член; если вы указали переменную s_instance, вы должны были бы , а затем получить об этом ошибки.

Также * находится не в том месте.

После этого вы также получите сообщение об ошибке s_instance, так как вы не определили его.

1

В sing.cpp вам нужно создать экземпляр s_instance так:

GlobalClass * GlobalClass::s_instance = NULL; 

И ваша функция static GlobalClass GlobalClass::*instance() в файле CPP не должны иметь static ключевое слово.

+1

Да, но это не приводит к ошибке _linker_. Таким образом, это не текущая проблема. –

+0

@ Светлые гонки на орбите. Да, но это был бы его второй вопрос :). –

+0

Действительно, но все же это не тот, который он задал –

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