-5

我正在为 C++ 类制作游戏,但指针有问题。为了给角色装备物品,我为不同的可穿戴物品类型创建了 8 个指针。我还创建了一个名为 noItem 的类,它继承自所有项目类型并将所有属性初始化为零。当我创建我的角色时,我创建了一个 noItem 实例并使所有指针都指向该实例,但是当我检查指针指向的地址时,只有一个指针指向 noItem 实例的地址。

我尝试重新排列指针分配的顺序,它始终是具有正确指针的相同指针,无论我何时将其指向 noItem 的实例,而其余的指向接近 noItem 实例地址的地址但从不实际上在那里。我什至尝试为每种项目类型创建一个 noItem 实例,但发生了同样的问题。

class parent1 {

};

class parent2 {

};

class child : public parent1, public parent2 {

};


int _tmain(int argc, _TCHAR* argv [])
{
parent1 *p1;
parent2 *p2;

child a;

p1 = &a;
p2 = &a;

cout << &a << endl;
cout << p1 << endl;
cout << p2 << endl;

system("pause");

}

在这个例子中 p1 指向 &a 但 p2 指向另一个地址。如果我更改子类从父类继承的顺序,p2 将指向 &a 但 p1 将指向另一个地址。为什么会这样?

4

3 回答 3

1

你说你做了这个

class Helm {}
class Legs {}
class Sleeves {}
class noItem : public Helm, public Legs, public Sleeves {}

相反,你应该做类似的事情

class Item {}
class Helm : public Item {}
class Legs : public Item {}
class Sleeves : public Item {}
于 2013-10-08T23:54:21.903 回答
0

将向量或指针列表添加到您的项目基类。根据需要分配并插入您的项目到列表中。不要硬编码一定数量的项目。缺少一件物品最好用没有任何东西来表示。

于 2013-10-08T22:50:07.930 回答
0

正如您所说,您的noItem类派生自许多其他类型,例如Helmet. 这意味着在noItem对象的某处,有一个Helmet子对象。它可能在一开始,但那里只能有一个子对象(通常是第一个基类,忽略复杂的继承方案)。

看看你的指针。您声称有一个是“正确的”。那是指向第一个基类子对象。现在计算sizeof(*correctPointer)。这将告诉您第二个子对象可以从哪里开始。可能会有一些填充,但总的来说,这将是神秘的差异。

于 2013-10-08T22:54:30.340 回答