Распечатать список объектов в Переполнение стека

Мне было интересно, сможет ли кто-нибудь помочь мне с распечаткой списка пользовательских классов (впервые используя контейнеры).

В настоящее время у меня есть переменная, объявленная как:

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;
}

1

Решение

Вы должны перегрузить 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;
}
3

Другие решения

у вас уже был список предметов в inventory, Переберите его и позвоните itemDetails

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

Это сделает работу.

1

Взгляни на std::for_each вместе с std::mem_fun, У MSDN есть хороший пример. Кроме того, вы всегда можете развернуть свой собственный цикл, вызывая функцию-член напрямую.

У меня нет компилятора, но что-то вроде этого должно сработать:

std::for_each(inventory.begin(), inventory.end(), std::mem_fun<Item>(&Item::printInventory));
1

Это простой цикл

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

Есть и другие способы, но я так и сделаю.

itemDetails не очень хорошее название для вашего метода. Может быть printDetails?

0

Вы можете перегрузить оператора << так что вы сможете вывести элемент через стандартный вывод. Вы можете найти несколько примеров Вот.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector