C ++我如何覆盖类中的 << 运算符

Posted

技术标签:

【中文标题】C ++我如何覆盖类中的 << 运算符【英文标题】:C++ how do i override the << operator within a class 【发布时间】:2020-04-08 21:07:55 【问题描述】:

我将如何覆盖类中的&lt;&lt; 运算符?或者能够在班级内打印vector&lt;byte&gt;。我当前的代码看起来像

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 &lt;&lt;并打印vector&lt;byte&gt;。我希望能够在课堂上打印一份。

编辑 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 文件? 什么是向量 - C++ 中没有字节数据类型 @StephanH en.cppreference.com/w/cpp/types/byte 不算数? @RidleyNelson 只有operator&lt;&lt; 的左侧才有可能将其实现为类成员方法。由于std::ostream 在您的示例中是左侧,因此您无法在类中实现此版本的operator&lt;&lt;,它需要是一个单独的函数。这很好。无论您遇到什么问题,都与我们看不到的其他问题有关,因为您没有展示您是如何尝试使用它的。 【参考方案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 &lt;&lt; MClass.myvector;cout &lt;&lt; MClass.vec;之类的事情时如何让它打印出一个向量

以上是关于C ++我如何覆盖类中的 << 运算符的主要内容,如果未能解决你的问题,请参考以下文章

模板类中的 c++ 赋值运算符实现

如何使用 XOR 赋值运算符 ^= 来反转 c 中的数组

c ++继承:基类中的2次重载运算符+在派生类中无法正常工作

如何覆盖 C++ 类中的 bool 运算符?

如何使用new()调用嵌套类中的方法?

模板类和插入提取重载