C ++, как мне переопределить оператор << в классе - PullRequest
0 голосов
/ 09 апреля 2020

Как бы я переопределил оператор << в классе? Или сможете печатать 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>. Я хочу иметь возможность напечатать один из класса.

Edit 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 в классе, но по некоторым комментариям это невозможно. Есть ли другой способ?

Редактировать 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

1 Ответ

1 голос
/ 09 апреля 2020

Не совсем понятно, чего вы хотите достичь и в каком контексте вы находитесь. Вот мой подход

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