首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重载<<操作符打印矢量数据成员

重载<<操作符打印矢量数据成员
EN

Stack Overflow用户
提问于 2019-03-12 14:47:51
回答 2查看 850关注 0票数 0

我创建了一个带有私有向量的类,它使用std::string作为其数据类型。

代码语言:javascript
运行
复制
#pragma once
#include <string>
#include <vector>
#include <iostream>

class Pokemon {
public:
//Constructor - leaving it here for reference
Pokemon(std::string name, int LVL, int HP, int ATK, int DEF, int SPATK, int SPDEF, int SPD, 
std::vector<std::string>moves, std::vector<int>PP);
//Member Functions
std::vector<std::string> getMoves();
private:
std::vector<std::string>moves;
};   

为了从这个向量中检索信息,我创建了一个名为getMoves()的公共类函数,它应该从该向量返回所有信息。下面是我在.cpp文件中编写的函数定义。

代码语言:javascript
运行
复制
std::vector<std::string> Pokemon::getMoves() {
    return moves;
}

在尝试打印带有std::cout这些移动的向量并收到“”错误后,我意识到必须重载<<操作符。

关于如何重载<<操作符,我有几个问题,这样我的向量就会打印出来。

  1. 我不知道该在哪里声明过载的operator.Do,我在上课前声明它?在我的班级里作为一个公共朋友的功能?在不同的头文件中?在我的主要功能里?
  2. 我该印什么型号的?我相信它将与我的类相同类型,因为getMoves()函数属于Pokemon类,但我不确定是它还是std::vector<std::string>
    1. 如何在我的主要功能中使用这个重载的操作符?就像正常的性病::cout?

我很感谢你对这些问题的帮助,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-12 15:00:50

下面的示例将重载每个向量的<<运算符。如果要为特定向量指定输出,则创建包装器结构或类。

代码语言:javascript
运行
复制
#include <iostream> 
#include <vector>

using namespace std; 

template <typename T> 
ostream& operator<<(ostream& os, const vector<T>& v) 
{ 
    os << "[";
    for (int i = 0; i < v.size(); ++i) { 
        os << v[i]; 
        if (i != v.size() - 1) 
            os << ", "; 
    }
    os << "]\n";
    return os; 
}

现在,当您想要像这样打印向量时:

代码语言:javascript
运行
复制
int main() {
    vector<int> a = {0, 1, 2};
    cout << a << endl;
}

它将打印以下结果:[0, 1, 2]

票数 0
EN

Stack Overflow用户

发布于 2019-03-12 16:25:41

代码语言:javascript
运行
复制
#include <iostream>
#include <vector>
#include <map>

// Helper Function to Print Test Containers (Vector and Map)
template <typename T, typename U>
std::ostream& operator<<(std::ostream& out, const std::pair<T, U>& p) {
    out << "[" << p.first << ", " << p.second << "]";
    return out;
} 

template <template <typename, typename...> class ContainerType, typename 
ValueType, typename... Args>
void print_container(const ContainerType<ValueType, Args...>& c) {
    for (const auto& v : c) {
        std::cout << v << ' ';
    }
    std::cout << '\n';
}

正如NutCracker提到的,在几乎所有类型的容器中,operator <<重载都是您最好的朋友。除了他的好答案外,这里还有一个模板化分辨率的扩展版本,用于打印所有类型的STL容器。

基本上,除了向量之外,对对类型的容器来说也是超载。作为一个例子。ValueType -> First or only Element in container templateArgs... variadic template as rest of the elements in container (第二个或多个元素)对于pair <T,U>基本映射-无序映射-您只有第一个和第二个元素到overload,您可以将此技术应用于几乎所有容器类型。如果您只想打印每个口袋妖怪特性而不调用任何额外的函数pokemon::getMoves(),您也可以overload << for pokemon class,也许最好只打印一个口袋妖怪等等。

friend允许私人和公共成员访问

代码语言:javascript
运行
复制
friend ostream& operator<< (ostream& os, const Pokemon& pokemonobj) {
    os << print_container(pokemonobj.getMoves());
    return os;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55124332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档