gpt4 book ai didi

c++ - 如何通过重载 << 运算符打印出 vector 中的对象?

转载 作者:行者123 更新时间:2023-11-28 03:23:27 24 4
gpt4 key购买 nike

好吧,我对所有这些运算符重载的东西感到困惑,语法对我来说很奇怪,而且我也不是很擅长编程。所以在互联网上环顾四周,显然我认为我使用 cout << 打印对象的唯一方法是是重载它。所以我有一个对象 vector ,通常如果我只有一个整数或字符串的常规 vector ,那么我只使用迭代器遍历每个对象,然后取消引用它以打印出其中的内容,但我不认为该技术适用于对象:-/这是我到目前为止所拥有的...帮助!

BarOne.h   //my header file
#include <string>
#include <vector>

using namespace std;

class BarOne
{
private:
string name;
string type;
string size;
vector<BarOne> bar; //vector of BarOne objects
vector<BarOne>::iterator it; //iterator for bar
public:
BarOne(); //constructor
void addBottle(string, string, string); //adds a new bottle to bar
void revealSpace();
void printInventory();
friend ostream& operator<<(ostream& os, const BarOne& b);
};

我的实现是这样的:

BarOne.cpp    //implementation
#include "BarOne.h"
#include <iostream>
#include <string>

using namespace std;



BarOne::BarOne()
{
//adding 4 default bottles
}


void BarOne::addBottle(string bottleName, string bottleType, string bottleSize)
{
name = bottleName;
type = bottleType;
size = bottleSize;
}


void BarOne::printInventory()
{
for (it = bar.begin(); it != bar.end(); ++it)
{
cout << *it << endl;
}
}


ostream& operator<<(ostream& os, const BarOne& b)
{
os << b.name << "\t\t\t" << b.type << "\t\t\t" << b.size;
return os;
}

那么当我在我的 main 中调用 printInventory 时它什么也没做?我做错了重载吗?语法错误?

好的,这也是主要的:

#include "BarOne.h"
#include <iostream>
#include <string>

using namespace std;




int main()
{

string Tiqo, Peruvian, Wellington, Smooze;
string vodka;
string rum;
string whiskey;
string small;
string medium;
string large;

//default bottles
vector<BarOne> bar; //vector of BarOne objects
vector<BarOne>::iterator it; //iterator for bar

BarOne Inventory; //BarOne object
Inventory.addBottle(Tiqo, vodka, large);
bar.push_back(Inventory);
Inventory.addBottle(Peruvian, rum, medium);
bar.push_back(Inventory);
Inventory.addBottle(Wellington, vodka, large);
bar.push_back(Inventory);
Inventory.addBottle(Smooze, whiskey, small);
bar.push_back(Inventory);

^^^这只是其中的一部分……剩下的只是格式化程序运行时的显示方式等等。好吧,我会尝试像有人建议的那样将类(class)分开。 AddBottle 在 vector 中添加该对象的信息,对吗?它获取信息,然后将其添加到变量名称、类型和大小中,然后将其放入 vector “bar”中。或者没有?

最佳答案

您没有向我们展示您的 main()程序。该代码以及您将栏内容与栏混淆的类设计导致了您看到的行为。

operator <<实际上可以输出瓶子的数据。但我确定 BarOne它被调用的地方有一个空的 bar vector 。你的addBottle()不在任何地方添加任何东西(特别是不添加到包含的 bar )。相反,它只是设置外部 BarOne 的属性(数据成员)目的。

这种混淆的根源是你的类设计,其中 BarOne显然是打算既用作瓶子又用作酒吧(其中包含瓶子)。

我建议您重新启动并尝试使用单独的 BarBottle类。

顺便说一句:将您在本地循环中使用的迭代器保留为类成员并不是一个好主意。这种方法迟早会遇到重入问题。循环迭代器应该是局部变量,最好限定在循环范围内。

关于c++ - 如何通过重载 << 运算符打印出 vector 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14800771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com