【问题标题】:Print a list of objects in C++ [closed]在 C++ 中打印对象列表 [关闭]
【发布时间】:2012-11-08 13:43:05
【问题描述】:

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

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

std::list<Item> inventory;

在一个名为 player 的类中。

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

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

我的Item 类包含 3 个变量;

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

我还有一个函数可以打印这些变量void itemDetails();

非常感谢任何帮助。

编辑:

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

在item类中重载了输出操作符:

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

【问题讨论】:

标签: c++ list class iterator


【解决方案1】:

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

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 用于使用自动和范围
【解决方案2】:

您已经在inventory 中有一个项目列表。遍历它并调用itemDetails

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

这样就可以了。

【讨论】:

    【解决方案3】:

    看看std::for_eachstd::mem_funThe MSDN has a nice example。或者,您可以随时推出自己的循环,直接调用成员函数。

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

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

    【讨论】:

      【解决方案4】:

      这是一个简单的for循环

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

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

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

      【讨论】:

        【解决方案5】:

        您可以重载运算符&lt;&lt;,这样您就可以通过标准输出输出项目。你可以找到一些例子here

        【讨论】:

        • '重叠',我喜欢!但技术上正确的术语是超载。
        • 哎呀!我脑子里还有其他事情……已编辑,谢谢!
        猜你喜欢
        • 1970-01-01
        • 2019-04-26
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多