C ++通过迭代器访问对象成员的指针列表

时间:2014-03-21 20:40:26

标签: c++ list pointers iterator polymorphism

这个问题已经把我的头撞到砖墙上了一段时间。希望我能在这里得到一些帮助。

基本上,我的游戏有一个包含许多不同对象的库存系统。有从基类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;
}

非常感谢任何帮助,我自己也老老实实地走到了死胡同。

1 个答案:

答案 0 :(得分:2)

问题在于您的addItem方法:

void Player::addItem(Object newItem)
{
    inventory.push_back(&newItem);
    return;
}

在这里,您按价值传递newItem 。这意味着newItem作为函数参数实际上是一个局部变量,保存传递给它的对象的副本。然后,您可以获取指向此局部变量的指针并将其存储以供以后使用,但它在函数末尾超出范围。此时指针不再有效。

要解决此问题,您应该通过引用传递newItem:最好作为实际引用(Object&),但是传递指针也可以。