cpp hpp分离

时间:2012-03-07 10:28:19

标签: c++ class compilation

当我尝试将类的声明和定义放入separatte 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 个答案:

答案 0 :(得分:4)

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

此定义不应包含static标记。只有声明。

实际上,你实际上并没有定义一个成员函数;如果您提供了s_instance变量,则然后就会出现错误。

此外*位置错误。

您之后也会收到有关s_instance的链接错误,因为您没有定义它。

答案 1 :(得分:3)

您对instance的定义有两个错误:

  1. static限定符是错误的。
  2. 返回类型的语法被扰乱了。指针属于类型,而不是函数的名称:

    GlobalClass* GlobalClass::instance()
    {
        if (!s_instance)
            s_instance = new GlobalClass;
        return s_instance;
    }
    
  3. 此外,您还需要像其他人注意到的那样定义静态成员s_instance

    GlobalClass* GlobalClass::s_instance = 0;
    

    但是这段代码有另一个问题:它会泄漏内存。 Don’t use raw pointers.

    最后,这段代码不是线程安全的,在某些情况下这可能是巨大的问题。假设您可以保证您的代码永远不会在多线程场景中运行,请继续。否则,你可能想要改变它(谁能提供如此强大的保证呢?)。

答案 2 :(得分:1)

必须定义静态标识符以及声明。

所以,将s_instance放入sing.cpp。而且我相信你应该把它初始化为NULL。

答案 3 :(得分:1)

在sing.cpp中,您需要像这样实例化s_instance

GlobalClass * GlobalClass::s_instance = NULL;

cpp文件中的函数static GlobalClass GlobalClass::*instance()不应包含static关键字。