通过迭代器访问指向对象成员的指针列表
C++ Accessing a list of Pointers to Objects members, through an iterator
这个问题一直困扰着我。我希望我能在这里得到一些帮助。
基本上,我的游戏有一个包含许多不同对象的库存系统。有从基类Object派生的不同类,它们使用虚函数,以便对相同的函数调用具有不同的行为。
最初,我有一个list inventory和一个list::iterator invIter。迭代器将调用库存中正确对象所需的函数,但只调用基类函数。我从另一个答案中读到,这样做的原因是因为你失去了多态性质,当你这样做,但有一个指针列表会补救它。
所以我改变了列表和迭代器,使它们成为对象指针,并找到了访问库存对象的函数和变量的正确方法。然而,当这些函数或变量在运行时被访问时,程序会出现一个未处理的异常并中断。
这是我的代码,导致问题....
头
#include "Object.h"
#include <vector>
#include <list>
using namespace std;
class Player
{
public:
Player();
void addItem(Object);
void printInventory();
list<Object*> inventory;
private:
list<Object*>::iterator invIter;
};
cpp
#include "Player.h"
#include "Object.h"
#include <iostream>
Player::Player()
{
}
void Player::addItem(Object newItem)
{
inventory.push_back(&newItem);
return;
}
void Player::printInventory()
{
cout << "YOU ARE CARRYING: n";
for(invIter=inventory.begin(); invIter!=inventory.end(); ++invIter)
{
cout << (*invIter)->getName() << ", ";
}
cout << "nPRESS RETURN TO CONTINUE...";
cin.ignore(1);
return;
}
任何帮助都是非常感谢的,我自己真的走进了死胡同
问题在于您的addItem
方法:
void Player::addItem(Object newItem)
{
inventory.push_back(&newItem);
return;
}
在这里,您通过值传递newItem
。这意味着newItem
作为一个函数参数,实际上是一个局部变量,持有传递给它的对象的副本。然后,您获取一个指向该局部变量的指针,并将其存储起来以供以后使用,但在函数结束时,它将超出作用域。此时,该指针不再有效。
要解决这个问题,您应该通过引用传递newItem
:最好作为实际引用(Object&
),但传递指向它的指针也可以。
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制