gpt4 book ai didi

c++ - 如何修改不可变对象(immutable对象)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:25 26 4
gpt4 key购买 nike

抱歉,我想不出这个问题的好标题...

在应用程序启动时,我通过数据库访问库从数据库加载对象,让我们调用它们的类 CDbObject

class CDbObject
{
//...
virtual CState getState() const { return m_state; }

protected:
CState m_state;
}

在运行时,我收到与这些数据库对象中的状态变化相对应的消息。
我想最小化数据库访问,因此在状态改变时不重新加载完整对象。
相反,我想包装 DB 对象并以某种方式使它们可修改。
我不能简单地派生一个类,实现一个 setState() 方法并创建该类的对象,因为我必须使用 DB 访问库提供给我的对象。这些对象没有实现复制机制,如果可能的话,我根本不想触及该代码。

我可以创建一个包装类来存储指向 CDbObject 实例的指针,如下所示:

class CWrapper
{
public:
CWrapper(CDbObject* p): m_pDbObject(p)
{
m_state.setValid(false);
}

void setState(CState state)
{
m_state.copy(state);
m_state.setValid(true);
}

CState getState() const
{
return m_state.isValid() ? m_state : m_pDbObject->getState();
}

private:
CDbObject* m_pDbObject;
CState m_state;
}

但明显的缺点是,我必须复制包装类的完整接口(interface)。
为了避免重复接口(interface),我可以提供对包装对象的访问,但这会使包装器实际上无用,因为如果用户不够谨慎,他可能会获得错误的状态。

是否有一种优雅的方式来完成我想要的?

编辑:

简而言之:我想让存储对象状态的地方对用户透明。用户应该通过调用一个方法来获取当前状态。我希望这能让它更清楚一些。

最佳答案

我支持 Jason,一个从 CDbObject 派生的类很容易解决这个问题,除非这些对象来自一些不透明的接口(interface)。

但是,如果您的应用程序崩溃,并且这些状态没有写回数据库,这会造成什么样的破坏?很多时候数据库是为了持久化,如果你删除/隐藏那个持久化,你能优雅地恢复吗?

关于c++ - 如何修改不可变对象(immutable对象)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1347613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com