如何打印出包含对象的向量?
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 说明如何做到这一点?以上是关于如何打印出包含对象的向量?的主要内容,如果未能解决你的问题,请参考以下文章