You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不可变类型构成的消息处理流水线中传递信息?

让你的消息类成为完全不可变类型的实现方案

嘿,我来帮你把这个ReceivedMessage类改造为完全不可变的类型,这样你在做逻辑推导的时候就不用担心意外修改状态啦!

核心改动与关键点

  • 所有成员变量设为const:一旦在构造函数初始化后,就再也无法修改它们的值,从根本上保证不可变性。
  • 构造函数初始化所有const成员:const成员变量不能在构造函数体内赋值,必须通过初始化列表完成——这里我把m_receivedAt直接用std::chrono::steady_clock::now()在构造时自动设置,确保消息的接收时间固定且无法篡改。
  • 所有成员函数标记为const:明确告诉调用者,这些函数不会改变对象的状态,同时也从语法上限制了函数内部修改成员变量的可能。

完整代码实现

#include <string>
#include <chrono>

class ReceivedMessage {
public:
    // 构造函数:一次性初始化所有不可变成员
    ReceivedMessage(const std::string& message) 
        : m_message(message), 
          m_receivedAt(std::chrono::steady_clock::now()) {}

    // 获取原始消息内容:返回const引用,避免拷贝同时防止外部修改
    const std::string& GetReceivedMessage() const {
        return m_message;
    }

    // 获取消息接收时间:返回时间点值类型,本身不可修改
    std::chrono::steady_clock::time_point GetReceivedAt() const {
        return m_receivedAt;
    }

private:
    // 不可变的消息内容
    const std::string m_message;
    // 不可变的接收时间点
    const std::chrono::steady_clock::time_point m_receivedAt;
};

额外的不可变性保障小技巧

  • 不可变对象的拷贝是安全的:因为拷贝后的对象状态和原对象一致,且都无法修改,所以不需要刻意禁用拷贝构造/赋值。
  • 如果类中有自定义类型的成员,要确保这些成员本身也是不可变类型,这样整个类的不可变性才是完整的。

这样改造后,ReceivedMessage对象一旦创建,它的消息内容和接收时间就永远固定了,完全符合你要的不可变类型需求,逻辑推导的时候就不用再担心状态变化的问题啦!

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:49:33