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

C++ Accessing a list of Pointers to Objects members, through an iterator

本文关键字:成员 指针 列表 对象 迭代器 访问      更新时间:2023-10-16

这个问题一直困扰着我。我希望我能在这里得到一些帮助。

基本上,我的游戏有一个包含许多不同对象的库存系统。有从基类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&),但传递指向它的指针也可以。