gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:53:27 25 4
gpt4 key购买 nike

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

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

最初,我有一个列表 list 以及一个列表::迭代器 invIter。迭代器会调用 list 中正确对象所需的函数,但只会调用基类函数。我从另一个答案中读到,这是因为当你这样做时你失去了多态性,但是有一个指针列表可以补救它。

所以我更改了列表和迭代器,使它们成为对象指针,并找到了访问库存对象的函数和变量的假定正确方法。但是,当在运行时访问这些函数或变量时,程序会出现未处理的异常并中断。

这是导致问题的我的代码....

标题

#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&),但传递指向它的指针也可以。

关于C++通过迭代器访问指向对象成员的指针列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22569116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com