所以我有一个对象的构造函数,在创建时设置一些值,然后将自己放在链表的末尾。
我遇到的问题是,当它将新对象的地址分配给列表的头部或尾部时,它会分配,离开构造函数,由于某种原因,头部和尾部都被重置为0。 / p>
Object Object1("OddJob", 2, 2, 9);
调用构造函数
Object::Object(string label, float x, float y, float z)
{
x_ = x;
y_ = y;
z_ = z;
if(label == "")
{
label = "Object";
}
label_ = label;
if(headObject == 0)
{
headObject = this;
tailObject = this;
}
else
{
tailObject->next = this;
tailObject = this;
}
next = 0;
}
编辑:headObject和tailObject是在.h文件中声明的全局变量。它们被声明为:
static Object * headObject;
static Object * tailObject;
答案 0 :(得分:3)
在全局对象上使用static
会导致它具有内部链接。这意味着包含您标头的每个翻译单元都将拥有拥有版本的headObject
和tailObject
。
相反,您应该在头文件中将它们声明为extern
:
extern Object * headObject;
extern Object * tailObject;
然后在单个翻译单元(通常是与.cpp
对应的.h
)中,您应该将定义指定为:
Object * headObject;
Object * tailObject;
您不能只在头文件中定义它们,否则当您在多个文件中包含标题时,您将破坏一个定义规则。
答案 1 :(得分:1)
将headObject和tailObject声明为Object类的静态成员。
class Object
{
static Object* headObject;
static Object* tailObject;
// Rest of class.
}
不要忘记在Object.cpp中定义它们,如下所示:
Object* Object::headObject = nullptr;
Object* Object::tailObject = nullptr;
或者在标题中将它们定义为“extern”:
extern Object* headObject;
extern Object* tailObject;
然后在Object.cpp中定义它们:
Object* headObject = nullptr;
Object* tailObject = nullptr;
否则,您实际上是在包含.h的每个cpp文件中定义它们。静态只是对每个文件说他们有自己的那些彼此不同的变量版本。因此,main.cpp中的headObject与Object.cpp中的headObject不同。不要混淆类静态和非类静态。您在没有静态的情况下看到的链接器错误解释了问题所在。如果你得到这样的链接错误,请查看它并尝试了解为什么你会得到它,否则你将很难找到你所看到的错误。