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

标签 c++ class visual-c++ vector operator-overloading

好吧,我对所有这些运算符重载的东西感到困惑,语法对我来说很奇怪,而且我也不是很擅长编程。所以在互联网上环顾四周,显然我认为我使用 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/

相关文章:

php - 在AS3中使用自定义类处理数据库查询

c++ - 获取地理位置源

c++ - 没有数据的类的对象是否占用内存?

python - 获取 Python 对象作为变体

c++迭代后破坏对象的问题

c++ - 处理输入和输出的C++函数

c++ - 对话框背景和单选按钮透明度

c++ - 如何在 VC++ 2010 中将 stdext::hash_set 用于自定义类型?

C++ 逗号分隔的 Txt 文件

c++ - 在函数中返回 unsigned char 数组而不是指针