如何打印出包含对象的向量?

Posted

技术标签:

【中文标题】如何打印出包含对象的向量?【英文标题】:How to print out a vector which holds objects? 【发布时间】:2020-05-10 23:10:57 【问题描述】:

这个问题源于我正在处理的更大的代码,但希望我可以将其分解以简化:

假设我有两个类,一个包含 2 个整数变量,另一个包含一个包含第一个类的向量

class TwoInts 
     int num1;
     int num2;


class NumHold 
    std::vector<TwoInts> numVector;

我将如何准确地打印我的 numHold 类?我知道我必须提供一个重载的流操作符

std::ostream &operator<< (std::ostream &out, const NumHold &myNumHold);

但是我对如何从向量中打印出这些整数的语法有点困惑。我也明白,为了让流操作符工作,我必须将它作为朋友添加到我的类中,我只是想让我的 NumHold 类尽可能简化,以便示例起见。希望这是一个足够清楚的解释,任何帮助表示赞赏

【问题讨论】:

忘掉流操作符吧。编写一个单独的函数来打印你的类的内容。只是一个简单的功能。没有什么花哨。这是std::ostream。这是你的课。现在打印它的内容。知道了?现在,一旦你让那部分工作,在你测试它并确保它产生漂亮的输出之后,将函数转换为重载运算符应该是微不足道的。任务完成! 【参考方案1】:

对待out你将如何对待std::cout,然后在函数结束时返回它:

std::ostream& operator<<(std::ostream& out, const NumHold &myNumHold)
    //one possible output format
    for(const auto& twoInt : myNumHold.numVector)
        out << twoInt.num1 << ", " << twoInt.num2 << '\n'; //pretend out is std::cout
    

    return out; //don't forget to return it at the end

如果合适,将重载声明为 NumHold 类中的友元函数:

#include<iostream>

class NumHold 
    private:
        std::vector<TwoInts> numVector;

    public:
        //friend operator overload declaration
        friend std::ostream& operator<<(std::ostream& out, const NumHold& myNumHold);
;

在您的示例中,这是合适的,因为重载函数访问私有变量。

【讨论】:

【参考方案2】:

您需要能够访问每个TwoInts 的成员才能打印它们。一种方法是公开它们。

class TwoInts 
public: //lets NumHold access variables to print
    int num1;
    int num2;
;

class NumHold 
public:
    std::vector<TwoInts> numVector;

    friend std::ostream& operator << (std::ostream& out, const NumHold& myNumHold) 
        for (const TwoInts& ti : myNumHold.numVector) 
            out << "(" << ti.num1 << ", " << ti.num2 <<  ")" << std::endl;
        
        return out;
    
;

【讨论】:

【参考方案3】:

您还可以考虑在您的类中添加打印方法:

#include<iostream>

class TwoInts 
    private:
        int num1;
        int num2;
    public:
        void printnum1()
            std::cout << num1;
        
        void printnum2()
            std::cout << num2;
         



class NumHold 
    private:
         std::vector<TwoInts> numVector;

    public:
         //this function prints the private attributes of the class
         void printnumVector()
             for (int i = 0; i < numVector.size(); i++)
                 std::cout << numVector[i].printnum1() << " " << numVector[i].printnum2() << std::endl;
                 
         
;

【讨论】:

您能否添加一个简短的代码 sn-p 说明如何做到这一点?

以上是关于如何打印出包含对象的向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建包含对象的向量?

如何从包含java中对象的向量中获取元素的索引

如何打印出 spark.sql 对象?

如何重建包含向量的非指针类成员?

如何在 Laravel 中打印出包含多个产品的所有订单?

如何将文件存储到包含 C++ 中的类对象的向量中?