【问题标题】:Initializing static pointer in static class [duplicate]在静态类中初始化静态指针[重复]
【发布时间】:2013-12-08 02:27:57
【问题描述】:

所以我有以下 c++ 类

class MyClass:

public: 

    static void InitObject();

private:

    static MyObject *myObject;       

};

然后在 .cpp 文件中进行操作

void MyClass::InitObject
{
    myObject = new MyObject();
}

但是,我收到一个编译器错误,说“myObject”是从 InitObject() 引用的,然后它说链接器命令失败,退出代码为 1。

为什么这不起作用?我该如何解决?

【问题讨论】:

  • 这是你实际编译的代码吗?
  • 我已经更改了类和静态变量的名称,但基本上是的,这就是我编译的

标签: c++ class pointers static linker


【解决方案1】:

由于 C++ 中类的静态数据成员需要与实例内存分开的内存空间,因此除了在类中声明之外,它们还需要定义 .

您可以在单独的翻译单元(在您的 CPP 文件中)执行此操作,如下所示:

MyObject *MyClass::myObject;

这个定义告诉编译器在静态内存区域为myObject分配空间。如果没有这个定义,代码会编译,但是链接器会报错,因为它负责确保所有引用的静态对象都有分配给它们的内存。

【讨论】:

    【解决方案2】:

    使用以下definitionmyObject 扩展您的.cpp 文件:

    MyObject* MyObject::myObject = NULL;
    

    注意:
    对于您的特定情况,您最好说:

    class MyClass:
    {
    public: 
        static MyClass& instance();
    
    private:
        MyClass() {}
    };
    

    在 .cpp 文件中:

    MyClass& MyClass::instance()
    {
        static MyClass myInstance;
        return myInstance;
    }
    

    比起使用new MyClass(),我更喜欢这个。对instance() 方法的任何访问都将保证您的实例只被初始化一次,并且您将获得对它的有效引用。
    'Space' 被完全分配在堆栈上,以及实例本身的引用。

    【讨论】:

      【解决方案3】:

      您从未为MyObject::myObject 分配空间。将其放入 CPP 文件中:

      MyObject* MyObject::myObject;
      

      【讨论】:

      • 为什么我需要为 myobject 分配空间?当我执行 myObject = new MyObject() 时不会发生这种情况吗?
      • 你的意思是 MyObject *MyClass::myObject 吗?
      • 没有。这为一个对象分配空间,myObject 是一个指针,而不是一个对象。您从未为MyObject::myObject 分配空间,您在头文件中所说的指针将存在。 (这是你的第一个问题。我不确定你的第二个问题是什么意思。你是在问空间去哪里的风格问题吗?)
      猜你喜欢
      • 2017-08-26
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2016-08-31
      • 2020-04-14
      相关资源
      最近更新 更多