cpp hpp separation

cpp hpp separation

本文关键字:separation hpp cpp      更新时间:2023-10-16

当我试图将类的声明和定义放入单独的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
static GlobalClass GlobalClass::*instance()
{
    if (!s_instance)
        s_instance = new GlobalClass;
    return s_instance;
}

此定义上不应该有static标记。只有声明。

实际上,您并没有定义成员函数;如果你提供了一个s_instance变量,你会,那么就会得到错误。

此外,*位于错误的位置。

您稍后还会得到关于s_instance的链接错误,因为您没有定义它。

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

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

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

此外,您还需要定义静态成员s_instance,正如其他人所指出的那样。

GlobalClass* GlobalClass::s_instance = 0;

但这段代码还有另一个问题:它会泄漏内存。不要使用原始指针。

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

在sing.cpp中,您需要实例化s_instance,如下所示:

GlobalClass * GlobalClass::s_instance = NULL;

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

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

所以,把s_instance放在你的sing.cpp里。我认为你应该将它初始化为NULL。