为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
喵喵时光机 2019-06-26 17:13:50
静态类成员上的未解析外部符号简单地说:我有一个类,主要由静态的公共成员组成,所以我可以将类似的函数组合在一起,这些函数仍然需要从其他类/函数中调用。无论如何,我已经在类公共范围中定义了两个静态的无符号字符变量,当我试图在同一个类的构造函数中修改这些值时,在编译时会得到一个“未解决的外部符号”错误。class test  {public:     static unsigned char X;     static unsigned char Y;     ...     test();};test::test() {     X = 1;     Y = 2;}我对C+不太熟悉,所以对我放松点。为什么我不能这么做?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

类声明中的静态数据成员声明不是它们的定义。要定义它们,您应该在.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.}


查看完整回答
反对 回复 2019-06-26
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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

对我来说,我忘记的是标记我的类定义__declspec(dllexport),当从另一个类(在该类的DLL边界之外)调用时,我当然得到了未解决的外部错误。
但是,当您将内部助手类更改为从其他地方访问的类时,很容易忘记,因此,如果您在动态链接的项目中工作,您最好也检查一下。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 472 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信