将多个指针分配给同一对象并检查地址后,只有一个指针指向正确的指针
After assigning multiple pointers to the same object and checking the addresses, only one of the pointers points to the right one
我正在为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 将指向另一个地址。 为什么会这样?
你说你这样做了
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 {}
正如你所说,你的noItem
类派生自许多其他类型,例如 Helmet
.这意味着在noItem
对象的某个地方,有一个Helmet
子对象。它可能在开头,但那里只能有一个子对象(通常是第一个基类,忽略复杂的继承方案(。
查看您的指针。有一个你声称是"正确的"。这指向第一个基类子对象。现在计算sizeof(*correctPointer)
.这将告诉您第二个子对象可以从哪里开始。可能会有一些填充,但总的来说,这正是神秘的区别。
向项基类添加向量或指针列表。 根据需要将项目分配并插入到列表中。不要对一定数量的项目进行硬编码。缺少物品最好表现为什么都没有。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 为什么我在C++中有一个空指针取消引用
- 为什么静态指针返回函数中有一个"静态"键?
- 从指向成员的指针的模板推导,其中至少有一个指向成员的指针是已知的
- 带有显式构造函数的智能指针使我有一个错误
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- 难道不应该有一个类似于"this"的与名称无关的类指针供成员函数在C++中引用吗?
- 指针怎么能有一个字符串作为它的值
- 我可以有一个模板函数指针的 std::vector 吗?
- 如果我有一个将指针变量作为输入的函数,有没有办法将函数作为参数传递
- 是否有可能有一个指针指向由奇怪的递归模板创建的基类
- 系统存储中的证书上下文总是有一个无效的pbCertEncoded指针
- C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
- 有一个可以是指针类型或非指针类型的模板参数
- 我有一个指向自定义项的未初始化指针表,我想检查是否已经存在某些内容
- C#:Cdecl-DllExport,参数中有一个指向类实例的指针