【问题标题】:undefined reference error due to use of static variables [duplicate]由于使用静态变量而导致的未定义引用错误[重复]
【发布时间】:2011-04-09 23:34:17
【问题描述】:

我今天早些时候问了一个关于单例的问题,但我在理解我遇到的一些错误时遇到了一些困难。我有以下代码:

Timing.h

class Timing {

public:
    static Timing *GetInstance();
private:
    Timing();
    static Timing *_singleInstance;
};

Timing.cpp

 #include "Timing.h"

 static Timing *Timing::GetInstance() {  //the first error
    if (!_singleInstance) {
        _singleInstance = new Timing();  //the second error
    }
    return _singleInstance;
}

这段代码中有两个我无法弄清楚的错误。

  1. 方法GetInstance() 在标头中声明为静态。为什么在cpp文件中我必须省略static这个词?它给出了错误:“不能声明成员函数‘静态计时*计时::GetInstance()’具有静态链接”。正确的写法是:

    Timing *Timing::GetInstance() { ... }  
    
  2. 为什么我不能写_singleInstance = new Timing();?它给出了错误:“对 Timing::_singleInstance 的未定义引用”。我通过在 cpp 文件中将 _singleInstance 定义为全局变量解决了这个错误。

【问题讨论】:

  • 这有点跑题了,但我觉得有必要提一下:你在 Stack Overflow 上问了很多问题。他们中的大多数都得到了正确的回答。是否有原因导致您不接受这些答案中的任何一个?如果您不奖励他人,回答您的问题可能会让他们感到沮丧。

标签: c++ static static-members


【解决方案1】:

1:当用于类声明之外的函数声明/定义时,静态表示“本地链接”。

本地链接意味着特定函数只能从该特定文件内的代码中引用,这对于类中的方法没有多大意义。

2:由于您的类声明可以包含多次,因此静态成员的实际存储应在 cpp 文件中定义:

#include "Timing.h"

Timing* Timing::_singleInstance;

Timing *Timing::GetInstance() {  //the first error
    if (!_singleInstance) {
        _singleInstance = new Timing();  //the second error
    }
    return _singleInstance;
}

【讨论】:

    【解决方案2】:

    参考问题2:您需要在cpp文件的顶部指定静态变量:

    Timing* Timing::_singleInstance = NULL;
    

    【讨论】:

    • 是的,我最终想通了,但我想知道我是否已经在头文件中定义了它,为什么我不能在 cpp 文件中使用它?
    • 您在头文件中声明了它,但没有定义它。你本质上说这个类有这样一个(静态)成员,但编译器不知道你想在哪个目标文件中为它保留内存。
    • 就像安德烈指出的那样,在实际程序开始运行之前,您需要为静态变量分配内存。静态变量总是可用。
    • 我现在明白了.. 谢谢大家的回答
    【解决方案3】:
    1. static 在类中的含义与static 完全不同。是的,这不是 C++ 最伟大的设计决策,但是,我们必须接受它。

    2. 我想抱怨来自链接器,这是因为您已经声明了该变量但从未定义它,使其成为未定义的引用。只需在您的 .cpp 文件中添加如下一行:

      Timing* Timing::_singleInstance;
      

    【讨论】:

      【解决方案4】:
      1. 是的,你必须省略 .cpp 文件中的静态

      2. 您必须在某处为_singleInstance“保留内存”,例如通过在 .cpp 文件中写入以下内容:

        时间 *Timing::_singleInstance = NULL;

      (在成员函数的定义之外)

      【讨论】:

        【解决方案5】:

        在定义中,需要省略 static 关键字。因为那是 C++ 的语法。没什么大不了的。

        一旦您修复了错误号 1,错误号 2 将自动修复。

        【讨论】:

        • 错误号 1 和 2 无关。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多