【问题标题】:Why won't my C++ program link when my class has static members?当我的类有静态成员时,为什么我的 C++ 程序不会链接?
【发布时间】:2009-12-29 21:14:04
【问题描述】:

我有一个名为 Stuff 的小类,我想在其中存储东西。这些东西是 int 类型的列表。在我使用的任何类的代码中,我都希望能够在 Stuff 类中访问这些东西。

Main.cpp:

#include "Stuff.h"

int main()
{
    Stuff::things.push_back(123);
    return 0;
}

东西.h:

#include <list>

class Stuff
{
public:
    static list<int> things;
};

但我在这段代码中遇到了一些构建错误:

错误 LNK2001:未解析的外部符号“公共:静态类 std::list > Stuff::things”(?things@Stuff@@2V?$list@HV?$ allocator@H@std@@@std@@A) Main.obj CSandbox

致命错误 LNK1120: 1 unresolved externals C:\Stuff\Projects\CSandbox\Debug\CSandbox.exe CSandbox

我是一名 C# 人,我正在尝试为一个业余项目学习 C++。我认为我不明白 C++ 如何处理静态成员。所以请解释一下我在这里做错了什么。

【问题讨论】:

  • 我可以礼貌地建议您尝试格式化您的代码示例吗? :-)
  • 如果我知道怎么做,我会的,尽管我注意到 Greg 很友善地为我做这件事
  • 我打算把我的答案和...2个新答案。只是因为我知道。

标签: c++ static


【解决方案1】:

在类声明中提及静态成员只是一个声明。您必须包含一个静态成员的定义,链接器才能正确连接所有内容。通常你会在Stuff.cpp 文件中包含如下内容:

#include "Stuff.h"

list<int> Stuff::things;

确保在您的程序中包含Stuff.cppMain.cpp

【讨论】:

  • @Greg - 那应该是list&lt;int&gt; Stuff::things;
  • 谢谢,刚刚注意到并修复了:)
【解决方案2】:

静态数据成员必须在类声明之外定义,就像方法一样。

例如:

class X {
    public:
        static int i;
};

还必须具备以下条件:

int X::i = 0; // definition outside class declaration

【讨论】:

    【解决方案3】:

    Stuff::things 只声明了,没有定义。

    请使用:

    // Stuff.cpp
    #include "Stuff.h"
    
    std::list<int> Stuff::things;
    

    添加:保护头文件不被多次包含也是一个好习惯:

    // Stuff.h
    #ifndef STUFF_H_
    #define STUFF_H_
    
    #include <list>
    
    class Stuff {
        public:
           static std::list<int> things;
    };
    
    #endif
    

    【讨论】:

      【解决方案4】:

      仅供参考,为什么这样做是因为在 C++ 中所有全局变量(包括静态全局变量)都是在主函数开始执行之前创建的。

      【讨论】:

        【解决方案5】:

        静态成员必须在类中声明,但在它实际所在的单元(cpp 文件)中定义。

        唯一的例外是类是模板的情况:在这种情况下,您必须在类之外定义成员,但您也必须在头文件中提供类声明。

        【讨论】:

          猜你喜欢
          • 2020-09-16
          • 2023-01-17
          • 2022-08-06
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多