1

我想知道是否有人可以帮助我打印出自定义类的列表(第一次使用容器)。

目前我有一个变量声明为:

std::list<Item> inventory;

在一个名为 player 的类中。

现在我在类(播放器)中创建了一个名为void printInventory();.

所以我的问题是如何打印该列表中的内容。

我的Item课程包含 3 个变量;

std::string name; 
int damage;
int value;

我也有打印这些变量的功能void itemDetails();

任何帮助深表感谢。

编辑:

由于提供的答案,我知道已经解决了我的问题,这就是我所做的:

重载项目类中的输出运算符:

    ostream& operator<<(ostream& os, const Item& item)
    {
            if (item.getTypeInt() == 0)
            {
                    os << "Name: " << item.getName() << endl
                    << "Type: " << item.getTypeString() << endl
                    << "Damage: " << item.getDamage()<< endl
                    << "Value: " << item.getValue() << endl;
            }
            else
            {
            os << "Name: " << item.getName() << endl
            << "Type: " << item.getTypeString() << endl
            << "HP: " << item.getHP()<< endl
            << "Value: " << item.getValue() << endl;
    }

    return os;
    }

然后我使用了其中一个答案,但对其进行了修改,因此它没有声明另一个变量:

    void Player::printInventory()
    {   
        for(std::list<Item>::iterator it = inventory.begin(); it!= inventory.end(); ++it)
        {
                cout << *it;
        }

        cout <<"Inventroy Printed!!"<<endl;
    }
4

5 回答 5

3

您应该重载std::ostream& operator<<forItemplayer,这将允许您将数据写入标准输出以外的流。这是一个例子:

std::ostream& ooprator<<(std::ostream& os, const Item& item)
{
  return os << "Item {" << item.name << " " << item.damage << " " << item.value << "}";
}

这可以让你做

Item i;
std::cout << i << "\n";

然后,您实现一个类似的运算符 for player,循环列表并打印每个项目。

std::ostream& ooprator<<(std::ostream& os, const player& p)
  for (const auto& i : p.inventory) os << i << " "
  return os;
}
于 2012-11-20T13:24:21.183 回答
1

std::for_each一起来看看std::mem_funMSDN 有一个很好的例子。或者,您总是可以推出自己的循环,直接调用成员函数。

我手头没有编译器,但这样的事情应该可以解决问题:

std::for_each(inventory.begin(), inventory.end(), std::mem_fun<Item>(&Item::printInventory));
于 2012-11-20T13:22:10.303 回答
1

您已经在inventory. 遍历它并调用itemDetails

void printInventory()
{
  for(std::list<Item>::iterator it = inventory.begin(); it!= inventory.end(); ++it)
  {
    Item item = *it;
    item.itemDetails();
  }
}

这将完成这项工作。

于 2012-11-20T13:28:38.310 回答
0

这是一个简单的for循环

for (std::list<Item>::iterator i = inventory.begin(); i != inventory.end(); ++i)
    i->itemDetails();

还有其他方法,但我就是这样做的。

itemDetails对于您的方法来说,这不是一个很好的名称。也许printDetails

于 2012-11-20T13:23:35.873 回答
0

您可以重载运算符<<,以便能够通过标准输出输出 Item。您可以在此处找到一些示例。

于 2012-11-20T13:24:00.080 回答