我指定一个指针,它自动为空

时间:2013-05-04 21:06:10

标签: c++ pointers constructor scope variable-assignment

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

我遇到的问题是,当它将新对象的地址分配给列表的头部或尾部时,它会分配,离开构造函数,由于某种原因,头部和尾部都被重置为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;

2 个答案:

答案 0 :(得分:3)

在全局对象上使用static会导致它具有内部链接。这意味着包含您标头的每个翻译单元都将拥有拥有版本的headObjecttailObject

相反,您应该在头文件中将它们声明为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不同。不要混淆类静态和非类静态。您在没有静态的情况下看到的链接器错误解释了问题所在。如果你得到这样的链接错误,请查看它并尝试了解为什么你会得到它,否则你将很难找到你所看到的错误。