Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对静态成员变量的未定义引用_C++_Static Members - Fatal编程技术网

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
短语更改为just
nextID
,那么我只会得到一个错误,如果我将其更改为
1
,那么它会正确链接。我想这很简单,但发生了什么事?

请确保您正在链接生成的.o文件。仔细检查makefile。

99.9%确定,因为当我将
++nextID
更改为
1
时,它链接正确。如果不引用
nextID
,则不需要定义它。因此,这并不表示最终可执行文件中存在该定义。事实上,它工作的事实表明您确实错过了与实现文件的链接。为什么这会有任何区别?如果我没有链接YarlObject.o文件,我会遇到与@Max相同的错误,当我链接它(使用内联构造函数)时,这些错误都消失了。-1:虽然这可能已经解决了@Max的问题,但绝大多数情况下肯定不是因为你所说的原因。我仔细检查了我的makefile,结果发现我忘记了用YarlObject.o更新它。谢谢你抓到它,并向第一个提到它的人道歉,因为他不相信它。这就是为什么我从不说我对编程中的任何事情都百分之百肯定。我几乎总是立刻被证明是错的。:)我知道@litb建议我们取消我们的否决票(尽管他的评论现在已经消失了),但实际上是其他人指出.o文件没有被链接到反对者。编辑答案说,现在我觉得没有必要给你任何信用。事实上,在@Max评论说他仔细检查了makefile之后写下“仔细检查makefile”让我希望我能投两次反对票。