这个问题已经把我的头撞到砖墙上了一段时间。希望我能在这里得到一些帮助。
基本上,我的游戏有一个包含许多不同对象的库存系统。有从基类Object派生的不同类,它们使用虚函数,以便使用相同的函数调用具有不同的行为。
最初,我有一个列表清单以及一个list :: iterator invIter。迭代器将调用库存中正确对象所需的函数,但只调用基类函数。我从另一个答案中读到,原因是你在执行此操作时失去了多态性,但有一个指针列表可以解决它。
所以我更改了列表和迭代器,因此它们是Object指针,并找到了访问库存对象的函数和变量的所谓正确方法。但是,当在运行时访问这些函数或变量时,程序会出现未处理的异常并中断。
这是导致问题的代码....
标题
#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;
}
非常感谢任何帮助,我自己也老老实实地走到了死胡同。
答案 0 :(得分:2)
问题在于您的addItem
方法:
void Player::addItem(Object newItem)
{
inventory.push_back(&newItem);
return;
}
在这里,您按价值传递newItem
。这意味着newItem
作为函数参数实际上是一个局部变量,保存传递给它的对象的副本。然后,您可以获取指向此局部变量的指针并将其存储以供以后使用,但它在函数末尾超出范围。此时指针不再有效。
要解决此问题,您应该通过引用传递newItem
:最好作为实际引用(Object&
),但是传递指针也可以。