C++ 对静态成员变量的未定义引用
我有一个静态成员的类。它也是我程序中其他几个类的基类。下面是它的头文件:C++ 对静态成员变量的未定义引用,c++,static-members,C++,Static Members,我有一个静态成员的类。它也是我程序中其他几个类的基类。下面是它的头文件: #ifndef YARL_OBJECT_HPP #define YARL_OBJECT_HPP namespace yarlObject { class YarlObject { // Member Variables private: static int nextID; // keeps track of the next ID number to be
#ifndef YARL_OBJECT_HPP
#define YARL_OBJECT_HPP
namespace yarlObject
{
class YarlObject
{
// Member Variables
private:
static int nextID; // keeps track of the next ID number to be used
int ID; // the identifier for a specific object
// Member Functions
public:
YarlObject(): ID(++nextID) {}
virtual ~YarlObject() {}
int getID() const {return ID;}
};
}
#endif
这是它的实现文件
#include "YarlObject.hpp"
namespace yarlObject
{
int YarlObject::nextID = 0;
}
我使用的是g++,它返回三个未定义的引用,指向'yarlObject::yarlObject::nextID链接器错误。如果我将构造函数中的
++nextID
短语更改为justnextID
,那么我只会得到一个错误,如果我将其更改为1
,那么它会正确链接。我想这很简单,但发生了什么事?请确保您正在链接生成的.o文件。仔细检查makefile。99.9%确定,因为当我将++nextID
更改为1
时,它链接正确。如果不引用nextID
,则不需要定义它。因此,这并不表示最终可执行文件中存在该定义。事实上,它工作的事实表明您确实错过了与实现文件的链接。为什么这会有任何区别?如果我没有链接YarlObject.o文件,我会遇到与@Max相同的错误,当我链接它(使用内联构造函数)时,这些错误都消失了。-1:虽然这可能已经解决了@Max的问题,但绝大多数情况下肯定不是因为你所说的原因。我仔细检查了我的makefile,结果发现我忘记了用YarlObject.o更新它。谢谢你抓到它,并向第一个提到它的人道歉,因为他不相信它。这就是为什么我从不说我对编程中的任何事情都百分之百肯定。我几乎总是立刻被证明是错的。:)我知道@litb建议我们取消我们的否决票(尽管他的评论现在已经消失了),但实际上是其他人指出.o文件没有被链接到反对者。编辑答案说,现在我觉得没有必要给你任何信用。事实上,在@Max评论说他仔细检查了makefile之后写下“仔细检查makefile”让我希望我能投两次反对票。