【问题标题】:C++ Accessing a list of Pointers to Objects members, through an iteratorC ++通过迭代器访问指向对象成员的指针列表
【发布时间】:2014-04-29 10:21:39
【问题描述】:

一段时间以来,我一直在用头撞砖墙来解决这个问题。希望我能在这里得到一些帮助。

基本上,我的游戏有一个包含许多不同对象的库存系统。有从基类 Object 派生的不同类,它们使用虚函数以便对相同的函数调用具有不同的行为。

最初,我有一个清单清单以及一个 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;
}

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

【问题讨论】:

    标签: c++ list pointers iterator polymorphism


    【解决方案1】:

    问题出在您的addItem 方法中:

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

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

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

    【讨论】:

    • 谢谢!完美运行。
    • 另外,请考虑使用list&lt;Object&gt; 而不是list&lt;Object *&gt;,如果合适,则意味着您需要做的内存管理要少得多。
    • @MattMcNabb A list&lt;Object&gt; 无法存储派生类型的对象,这可能是 OP 正在做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多