Answers:
类声明中的静态数据成员声明不是它们的定义。要定义它们,您应该在.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.
}
由于这通常是我在搜索“带有静态const成员的未解决的外部对象”时似乎想到的第一个SO线程,因此,我将在这里留下另一个提示来解决未解决的外部对象的一个问题:
对我来说,我忘记的是标记我的类定义__declspec(dllexport)
,并且从另一个类(在该类的dll的边界之外)调用该类时,我当然遇到了我无法解决的外部错误。
不过,当您将内部帮助程序类更改为可从其他地方访问的类时,很容易忘记,因此,如果您在动态链接的项目中工作,则也可能需要进行检查。
就我而言,我在.h文件中声明了一个静态变量,例如
//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}
在myClass.cpp中,我尝试使用此m_nMyVar。出现LINK错误,例如:
错误LNK2001:无法解析的外部符号“ public:静态类...与链接错误相关的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不见了。
就我而言,我使用了错误的链接。
它使用c ++(cli)进行管理,但具有本机导出功能。我已向链接器->输入->程序集链接资源中添加了从中导出函数的库的dll。但是本机c ++链接需要.lib文件才能正确“查看” cpp中的实现,因此对我来说,帮助将.lib文件添加到链接器->输入->其他依赖项。
[通常,托管代码不使用dll导出和导入,而是使用引用,但这是唯一的情况。