簡體   English   中英

為什么我無法使用我的增量運算符重載? [C++]

[英]Why am I unable to use my increment operator overload? [C++]

我有以下結構:

struct sequence_t {
    uint8_t val;
    explicit sequence_t(uint8_t value) : val(value) {}
    sequence_t() : sequence_t(0) {}

    auto operator++() -> sequence_t& { // prefix
        val = (val + 1) % 16;
        return *this;
    }

    auto operator++(int) -> sequence_t { // postfix
        sequence_t tmp{val};
        ++*this;
        return tmp;
    }

    uint8_t value() const { return val; }
    auto operator==(const sequence_t& other) const -> bool = default;
    auto operator==(const uint8_t other) const -> bool { return val == other; }
};

我在這樣聲明的 class 中使用它:

class messenger {
  private:
    sequence_t sequence;

  public:
    messenger() = default;
    ~messenger() = default;
    auto make_message(const uint8_t type) const -> std::shared_ptr<std::uint8_t[]>;
    auto make_message(uint8_t const* data, const uint8_t size) const -> std::shared_ptr<std::uint8_t[]>;
    auto parity(uint8_t const* buffer) const -> std::uint8_t;
};

我在信使 class 的 make_message() 成員中調用運算符,因為我想在創建消息時更新序列的值(到整個信使對象):

auto messenger::make_message(uint8_t const* data, const uint8_t data_size) const -> std::shared_ptr<std::uint8_t[]> {
    auto buffer = std::make_shared<std::uint8_t[]>(sizeof(header) + data_size + sizeof(parity(nullptr)));
    ++sequence;
    header h = {START, data_size, sequence.value(), TYPE_DATA}; // TODO: implementar sequência
    std::copy(std::bit_cast<uint8_t*>(&h), std::bit_cast<uint8_t*>(&h) + sizeof(header), buffer.get());
    std::copy(data, data + data_size, buffer.get() + sizeof(header));
    buffer[sizeof(header) + data_size] = parity(buffer.get());
    return buffer;
}

但是,當我嘗試在信使 class 方法中使用 sequence++ 或 ++sequence 時,我收到以下錯誤:

error: passing ‘const sequence_t’ as ‘this’ argument discards qualifiers [-fpermissive]
[build]    17 |     ++sequence;
[build]       |       ^~~~~~~~

為什么是常量? 如何修改序列的內容?

auto messenger::make_message(uint8_t const* data, const uint8_t data_size) const

最后的const關鍵字表示這是一個const class 方法。 一個const class 方法:

  1. 只能調用其他const class 方法
  2. 無法修改任何 class 成員
  3. 如果任何 class 成員是對象,則只能調用它們的const方法

(忽略顯式mutable class 成員,以避免混淆)

++sequence有效地調用了sequence的方法。 根據規則 3,它不是const class 方法,因此會出現編譯錯誤。

您有以下選擇:

  • make_message()更改為不是const class 方法。
  • 鑒於此處的示例用法,將sequence聲明為mutable class 成員可能是可行的。 您必須充分了解這樣做的后果。

您在const object 上使用重載增量運算符,但運算符本身不是const

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM