CPP HPP разделение - PullRequest
       22

CPP HPP разделение

1 голос
/ 07 марта 2012

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

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

Ответы [ 4 ]

4 голосов
/ 07 марта 2012
static GlobalClass GlobalClass::*instance()
{
    if (!s_instance)
        s_instance = new GlobalClass;
    return s_instance;
}

В этом определении не должно быть тега static. Только декларация.

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

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

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

3 голосов
/ 07 марта 2012

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

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

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

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

GlobalClass* GlobalClass::s_instance = 0;

Но у этого кода есть еще одна проблема: утечка памяти. Не используйте необработанные указатели.

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

1 голос
/ 07 марта 2012

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

GlobalClass * GlobalClass::s_instance = NULL;

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

1 голос
/ 07 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...