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

C++ how do i override the << operator within a class

如何覆盖 class 中的 << 运算符?或者能够从 class 中打印出 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;
}

它挂在class之外,只有在class之外的功能才能cout <<打印一个vector<byte>。我希望能够从 class.

中打印一个

编辑 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;
}

我想在 class 中排名第一 method 1,但根据某些评论,这是不可能的。有什么不同的方法吗?

编辑 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

不确定你想要实现什么以及你所处的环境。这是我的方法

#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;
    }
};