首页 文章

静态类成员上未解析的外部符号

提问于
浏览
111

非常简单地说:

我有一个主要由静态公共成员组成的类,所以我可以将类似的函数组合在一起,但仍然需要从其他类/函数中调用它们 .

无论如何,我在我的类公共范围中定义了两个静态unsigned char变量,当我尝试在同一个类的构造函数中修改这些值时,我在编译时遇到“未解析的外部符号”错误 .

class test 
{
public:
    static unsigned char X;
    static unsigned char Y;

    ...

    test();
};

test::test() 
{
    X = 1;
    Y = 2;
}

我是C的新手,所以对我很轻松 . 为什么我不能这样做?

4 回答

  • 58

    您忘记添加定义以匹配您的X和Y声明

    unsigned char test::X;
    unsigned char test::Y;
    

    某处 . 您可能还想初始化静态成员

    unsigned char test::X = 4;
    

    再次,你在定义中(通常在CXX文件中)不在声明中(通常在.H文件中)

  • 3

    类声明中的静态数据成员声明不是它们的定义 . 要定义它们,您应该在 .CPP 文件中执行此操作以避免重复的符号 .

    您可以声明和定义的唯一数据是整数静态常量 . ( enums 的值也可以用作常量值)

    您可能希望将代码重写为:

    class test {
    public:
      const static unsigned char X = 1;
      const static unsigned char Y = 2;
      ...
      test();
    };
    
    test::test() {
    }
    

    如果您希望能够修改静态变量(换句话说,当将它们声明为const时不合适),您可以通过以下方式在 .H.CPP 之间分隔代码:

    . H :

    class test {
    public:
    
      static unsigned char X;
      static unsigned char Y;
    
      ...
    
      test();
    };
    

    .CPP:

    unsigned char test::X = 1;
    unsigned char test::Y = 2;
    
    test::test()
    {
      // constructor is empty.
      // We don't initialize static data member here, 
      // because static data initialization will happen on every constructor call.
    }
    
  • 1

    因为这是第一个在搜索“静态const成员的未解析的外部”时似乎出现的SO线程,所以我将留下另一个提示来解决一个未解决的外部问题:

    对我来说,我忘了的是标记我的类定义 __declspec(dllexport) ,当从另一个类(在类's dll'的边界之外)调用时,我当然得到了我未解决的外部错误 .
    当你在一个动态链接的项目中工作时,很容易忘记,你也可以检查一下 .

  • 126

    在我的例子中,我在.h文件中声明了一个静态变量,就像

    //myClass.h
    class myClass
    {
    static int m_nMyVar;
    static void myFunc();
    }
    

    在myClass.cpp中,我尝试使用这个m_nMyVar . 它有LINK错误,如:

    错误LNK2001:未解析的外部符号“public:static class ...链接错误相关的cpp文件如下所示:

    //myClass.cpp
    void myClass::myFunc()
    {
    myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
    }
    

    所以我在myClass.cpp的顶部添加以下代码

    //myClass.cpp
    int myClass::m_nMyVar; //it seems redefine m_nMyVar, but it works well
    void myClass::myFunc()
    {
    myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
    }
    

    然后LNK2001消失了 .

相关问题