0

所以我有一个对象的构造函数,它在创建时设置一些值,然后将自己放在链表的末尾。

我遇到的问题是,当它将新对象的地址分配给列表的头部或尾部时,它分配,离开构造函数,并且由于某种原因头部和尾部都被重置为 0。

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;
4

2 回答 2

3

全局对象上的使用static会导致它具有内部链接。这意味着包含您的标题的每个翻译单元都将有自己headObject的和版本tailObject

extern相反,您应该在头文件中声明它们:

extern Object * headObject;
extern Object * tailObject;

然后在单个翻译单元(通常.cpp对应于 that .h)中,您应该给出如下定义:

Object * headObject;
Object * tailObject;

你不能像这样在头文件中定义它们,否则当你在多个文件中包含头文件时,你会破坏一个定义规则。

于 2013-05-04T21:13:17.447 回答
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 不同。不要混淆类静态和非类静态。您在没有静态的情况下看到的链接器错误正在解释问题所在。如果您收到这样的链接错误,请查看并尝试了解为什么您会收到它,否则您将很难追踪您所看到的错误。

于 2013-05-04T21:13:27.433 回答