C++ 设计模式,以避免复制和向下转换



我有一个保存大量数据的C++类。

class obj {
public:
obj(data_t data) : large_data(data) {}
private:
data_t large_data;
};

以及一个子类,它使用名为pos的不可变地址值来扩充大块数据。基本思想是,obj最初没有位置,但一段时间后可能会被赋予一个永远不会改变的位置。

class safe_obj : public obj {
public:
safe_obj(int pos, data_t data) :
obj(data), pos(pos)
{}
int pos() const { return pos; }
private:
int pos;
};

到目前为止,我一直在创建objsafe_obj实例的实例。我希望能够做的是有一种很好的方法来获取现有的obj实例并为其分配位置,同时最大限度地减少任何数据移动。

我最初的想法是更改我的代码以始终分配safe_obj然后将指针传递给一种类型或另一种类型。当需要分配位置时,实例将已经分配了该空间。

这种方法似乎需要某种类型的SetPos接口,我想避免这样做,以严格执行位置的不变性。

另一种选择是将obj::large_data存储在堆上,并在需要时将指针传递给全新的safe_obj实例。

还有其他选择吗?

如果您不想要SetPos接口,因为位置只能设置一次,则可以使用InitPos接口。函数名称是不言自明的,第二次调用时会生成错误。

作为另一种选择,您可以在safe_obj中使用obj作为类成员而不是基类,但这会影响缓存局部性,因为poslarge_data不会彼此相邻。

最新更新