C ++我如何覆盖类中的 << 运算符
Posted
技术标签:
【中文标题】C ++我如何覆盖类中的 << 运算符【英文标题】:C++ how do i override the << operator within a class 【发布时间】:2020-04-08 21:07:55 【问题描述】:我将如何覆盖类中的<<
运算符?或者能够在班级内打印vector<byte>
。我当前的代码看起来像
ostream& operator<<(ostream& os, const vector<byte>& bytes)
if (bytes.size() == 0)
return os;
for (size_t i = 0; i < bytes.size()-1; i++)
os << hex << (int)bytes[i] << " ";
os << bytes.back();
return os;
它挂在类外,只有类外的函数可以cout <<
并打印vector<byte>
。我希望能够在课堂上打印一份。
编辑 1
我在提到我如何使用它的部分看到了一些混乱,这将是一个很好的例子
# method 1
ostream& operator<<(ostream& os, const vector<byte>& bytes)
if (bytes.size() == 0)
return os;
for (size_t i = 0; i < bytes.size()-1; i++)
os << hex << (int)bytes[i] << " ";
os << bytes.back();
return os;
int main(
vector<byte> v = something;
cout << “Vector Example: ” << v << endl;
我想在班级中获得最高的method 1
,但对于某些 cmets,这是不可能的。有什么不同的方法吗?
编辑 2
感谢@StephanH,我想分享我修改后的工作代码。
#include <vector>
#include <fstream>
#include <cstddef>
#include <iostream>
#include <iomanip>
#include <string>
std::ostream& operator<<(std::ostream& os, const std::vector<std::byte>& bytes)
if (bytes.size() == 0)
return os;
for (size_t i = 0; i < bytes.size() - 1; i++)
os << std::hex<< (int)bytes[i] << " ";
os << int(bytes.back());
return os;
class MClass
public:
std::vector<std::byte> smth;
friend std::ostream& operator<<(std::ostream& stream, const MClass& obj)
std::string ascii = "hello";
std::vector<std::byte> bytes(ascii.length());
for (size_t i = 0; i < ascii.length(); i++)
bytes[i] = static_cast<std::byte>(ascii[i]);
return stream << bytes;
;
int main()
MClass m;
std::cout<<m;
仍在试图弄清楚如何打印出我在做什么m.smth
【问题讨论】:
我只想补充一点,我对 c++ 还很陌生,我 5 天前开始学习,但我现在正在编写一个安全且体积更大的加密程序。 您在尝试编译时遇到什么错误?这个类是全部在一个文件中,还是拆分为.h
和.cpp
文件?
什么是向量operator<<
的左侧才有可能将其实现为类成员方法。由于std::ostream
在您的示例中是左侧,因此您无法在类中实现此版本的operator<<
,它需要是一个单独的函数。这很好。无论您遇到什么问题,都与我们看不到的其他问题有关,因为您没有展示您是如何尝试使用它的。
【参考方案1】:
不确定您想要实现什么以及您所处的环境。这是我的方法
#include <vector>
#include <fstream>
#include <cstddef>
#include <iostream>
#include <iomanip>
std::ostream& operator<<(std::ostream& os, const std::vector<std::byte>& bytes)
if (bytes.size() == 0)
return os;
for (size_t i = 0; i < bytes.size() - 1; i++)
os << std::hex<< (int)bytes[i] << " ";
os << int(bytes.back());
return os;
class MClass
std::vector<std::byte> smth;
friend std::ostream& operator<<(std::ostream& stream, const MClass& obj)
return stream << obj.smth;
;
【讨论】:
Just1 不得不查看friend
文档,看起来很棒,我将如何使用它?
没关系让它工作,我只需要弄清楚当我做cout << MClass.myvector;
或cout << MClass.vec;
之类的事情时如何让它打印出一个向量以上是关于C ++我如何覆盖类中的 << 运算符的主要内容,如果未能解决你的问题,请参考以下文章
如何使 cat 和 grep 在 c 中的第一个和第二个管道中工作,就像 bash 中的 heredoc <<
c ++如何将视频序列放入OpenCV中的vector<Mat>?