【问题标题】: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。这是你的课。现在打印它的内容。知道了?现在,一旦你让那部分工作,在你测试它并确保它产生漂亮的输出之后,将函数转换为重载运算符应该是微不足道的。任务完成!

标签: c++ class oop vector


【解决方案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 说明如何做到这一点?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多