我想知道是否有人可以帮我解决打印自定义类列表(第一次使用容器)。
目前我有一个变量声明为:
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;
}
答案 0 :(得分:3)
您应该为std::ostream& operator<<
和Item
重载player
,这样您就可以将数据写入除stdout之外的流。这是一个例子:
std::ostream& ooprator<<(std::ostream& os, const Item& item)
{
return os << "Item {" << item.name << " " << item.damage << " " << item.value << "}";
}
这允许你做
Item i;
std::cout << i << "\n";
然后,为player
实现类似的运算符,循环遍历列表并打印每个项目。
std::ostream& ooprator<<(std::ostream& os, const player& p)
for (const auto& i : p.inventory) os << i << " "
return os;
}
答案 1 :(得分:1)
与std::for_each
一起查看std::mem_fun
。 The MSDN has a nice example。或者,您可以随时推出自己的循环,直接调用成员函数。
我手上没有编译器,但是这样的事情应该可以解决问题:
std::for_each(inventory.begin(), inventory.end(), std::mem_fun<Item>(&Item::printInventory));
答案 2 :(得分:1)
您已在inventory
中找到了一个项目列表。迭代它并调用itemDetails
void printInventory()
{
for(std::list<Item>::iterator it = inventory.begin(); it!= inventory.end(); ++it)
{
Item item = *it;
item.itemDetails();
}
}
这将完成这项工作。
答案 3 :(得分:0)
这是一个简单的for循环
for (std::list<Item>::iterator i = inventory.begin(); i != inventory.end(); ++i)
i->itemDetails();
还有其他方法,但我就是这样做的。
itemDetails
对你的方法来说不是一个很好的名字。也许printDetails
?
答案 4 :(得分:0)
您可以重载运算符<<
,以便您能够通过标准输出输出项目。您可以找到一些示例here。