Мне было интересно, сможет ли кто-нибудь помочь мне с распечаткой списка пользовательских классов (впервые используя контейнеры).
В настоящее время у меня есть переменная, объявленная как:
std::list<Item> inventory;
в классе под названием игрок.
Теперь я создал функцию в классе (игрок) под названием 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;
}
Вы должны перегрузить 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;
}
у вас уже был список предметов в inventory
, Переберите его и позвоните itemDetails
void printInventory()
{
for(std::list<Item>::iterator it = inventory.begin(); it!= inventory.end(); ++it)
{
Item item = *it;
item.itemDetails();
}
}
Это сделает работу.
Взгляни на std::for_each
вместе с std::mem_fun
, У MSDN есть хороший пример. Кроме того, вы всегда можете развернуть свой собственный цикл, вызывая функцию-член напрямую.
У меня нет компилятора, но что-то вроде этого должно сработать:
std::for_each(inventory.begin(), inventory.end(), std::mem_fun<Item>(&Item::printInventory));
Это простой цикл
for (std::list<Item>::iterator i = inventory.begin(); i != inventory.end(); ++i)
i->itemDetails();
Есть и другие способы, но я так и сделаю.
itemDetails
не очень хорошее название для вашего метода. Может быть printDetails
?
Вы можете перегрузить оператора <<
так что вы сможете вывести элемент через стандартный вывод. Вы можете найти несколько примеров Вот.