在为同一个对象分配多个指针并检查地址后,只有一个指针指向右边的指针

时间:2013-10-08 22:47:39

标签: c++ pointers

我正在为一个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指向&amp; a但p2指向另一个地址。如果我改变子类从父类继承的顺序,p2将指向&amp; a但是p1将指向另一个地址。为什么会这样?

3 个答案:

答案 0 :(得分: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 {}

答案 1 :(得分:0)

向项目基类添加向量或指针列表。根据需要将项目分配并插入列表。不要硬编码一定数量的项目。缺少一个项目最好的代表是没有任何东西。

答案 2 :(得分:0)

正如您所述,您的noItem类来自许多其他类型,例如: Helmet。这意味着在noItem对象中的某个位置,有一个Helmet子对象。它可能在开头,但是那里只能有一个子对象(通常是第一个基类,忽略了复杂的继承方案)。

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