猿问

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

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

简单地说:

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

无论如何,我已经在类公共范围中定义了两个静态的无符号字符变量,当我试图在同一个类的构造函数中修改这些值时,在编译时会得到一个“未解决的外部符号”错误。

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

    ...

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

我对C+不太熟悉,所以对我放松点。为什么我不能这么做?


喵喵时光机
浏览 473回答 3
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.}

qq_花开花谢_0

由于这是第一个在搜索“静态Const成员的未解决外部性”时出现的SO线程,因此我将在这里留下另一个提示来解决一个未解决的外部问题:对我来说,我忘记的是标记我的类定义__declspec(dllexport),当从另一个类(在该类的DLL边界之外)调用时,我当然得到了未解决的外部错误。但是,当您将内部助手类更改为从其他地方访问的类时,很容易忘记,因此,如果您在动态链接的项目中工作,您最好也检查一下。
随时随地看视频慕课网APP
我要回答