首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >静态类成员上未解析的外部符号

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

Stack Overflow用户
提问于 2008-10-12 07:45:07
回答 5查看 148.1K关注 0票数 147

非常简单地说:

我有一个主要由静态公共成员组成的类,因此我可以将类似的函数分组在一起,这些函数仍然需要从其他类/函数调用。

无论如何,我在我的类的public作用域中定义了两个静态的无符号字符变量,当我试图在同一个类的构造函数中修改这些值时,我在编译时得到了一个"unresolved symbol“错误。

代码语言:javascript
复制
class test 
{
public:
    static unsigned char X;
    static unsigned char Y;

    ...

    test();
};

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

我是新来C++的,所以别对我太客气。为什么我不能这么做?

EN

回答 5

Stack Overflow用户

发布于 2008-10-12 08:26:30

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

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

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

代码语言:javascript
复制
class test {
public:
  const static unsigned char X = 1;
  const static unsigned char Y = 2;
  ...
  test();
};

test::test() {
}

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

.H:

代码语言:javascript
复制
class test {
public:

  static unsigned char X;
  static unsigned char Y;

  ...

  test();
};

.CPP:

代码语言:javascript
复制
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.
}
票数 72
EN

Stack Overflow用户

发布于 2018-05-04 15:37:41

由于这是我在搜索“带有静态常量成员的未解析外部变量”时出现的第一个SO线程,因此我将在这里留下另一个提示来解决一个带有未解析外部变量的问题:

对我来说,我忘记的事情是标记我的类定义__declspec(dllexport),当从另一个类(在那个类的dll边界之外)调用时,我当然得到了my unresolved外部错误。

不过,当您将内部帮助器类更改为可从其他地方访问的帮助器类时,很容易忘记这一点,因此,如果您正在动态链接的项目中工作,最好也进行检查。

票数 6
EN

Stack Overflow用户

发布于 2018-09-19 07:35:41

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

代码语言:javascript
复制
//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}

在myClass.cpp中,我尝试使用这个m_nMyVar。出现链接错误,如下所示:

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

代码语言:javascript
复制
//myClass.cpp
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

因此,我在myClass.cpp的顶部添加了以下代码

代码语言:javascript
复制
//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就走了。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/195207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档