非常简单地说:

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

无论如何,我在我的类公共范围中定义了两个静态unsigned char变量,当我尝试在同一个类的构造函数中修改这些值时,我得到一个<!> quot; unresolved external symbol <!> quot;编译错误。

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

    ...

    test();
};

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

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

有帮助吗?

解决方案

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

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

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

unsigned char test::X = 4;

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

其他提示

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

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

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

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

test::test() {
}

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

.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.
}

因为这是第一个在搜索带有静态const成员<!>的未解析外部时出现的SO线程。一般来说,我会留下另一个提示来解决一个未解决的外部问题:

对我而言,我忘记的是标记我的类定义__declspec(dllexport),当从另一个类(在该类的dll的边界之外)调用时,我当然得到了我未解决的外部错误。
当你将内部助手类改为可从其他地方访问的类时,很容易忘记,所以如果你在动态链接的项目中工作,你也可以检查它。

就我而言,我在.h文件中声明了一个静态变量,比如

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

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

错误LNK2001:未解析的外部符号<!> quot; 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消失了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top