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

很简单地说:

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

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

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() { } 

如果你想有修改你静态variables的能力(换句话说,当把它们声明为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. } 

请参阅https://isocpp.org/wiki/faq/ctors#link-errs-static-data-mems (以前的C ++ FAQ Lite)。 您可能需要阅读FAQ的其余部分。