需要专门访问私人类状态的设计建议
Need design advice for exclusive access to private class state
我正在开发一个涉及序列化用户对象的简单系统。我有一系列专门的模板类,它们对每种类型的读/写都有不同的作用:
template<class T>
class ItemSerializer;
template<>
class ItemSerializer<int>
{
public:
static void store( int const& obj )
{
}
static void fetch( int& obj )
{
}
};
template<>
class ItemSerializer<NoteNumberArray>
{
public:
static void store( NoteNumberArray const& obj )
{
// NoteNumberArray::_blocks is used here.
}
static void fetch( NoteNumberArray& obj )
{
// NoteNumberArray::_blocks is used here.
}
};
根据类型的不同,它可能有状态,也可能没有状态,这对于它所分配到的序列化程序类是必需的。在本例中,我有两种类型的序列化程序:int
和NoteNumberArray
。对于int
类型,存储/获取函数不需要任何额外的状态,读/写实现非常简单。
然而,对于NoteNumberArray
,state是必需的,所以我创建了自己的类,而不是使用核心类型或STL类型。此状态仅用于实现ItemSerializer
,用于优化目的。这种私有状态将用于优化读/写方法的速度和效率。由于序列化程序类不是有状态的,所以我将此状态放在用户对象中。
我可能会让ItemSerializer
成为NoteNumberArray
的朋友,但这会导致循环依赖,并使ItemSerializer
可以访问更多的NoteNumberArray
。
这样一个系统的好设计是什么?只是想找一些技巧来帮助我开始。以下是这个例子的一些其他相关片段:
class Block
{
};
class NoteNumberArray
{
public:
// Public interface, none of which will use _blocks. Only ItemSerializer uses _blocks.
private:
std::vector<int> _array; // This should not be used directly by anyone, including ItemSerializer.
std::vector<Block> _blocks; // This is the private state only used by ItemSerializer
};
我没有看到循环依赖性问题,不存在使ItemSerializer<NoteNumberArray>
成为NoteNumberArray
的朋友的依赖性问题。
如果您不希望ItemSerializer<NoteNumberArray>
能够看到NoteNumberArray
的其他私有部分,我确实看到了访问问题。
一种可能性是将_blocks
封装到另一个类NoteNumberArraySerializerHelper
中,该类将ItemSerializer<NoteNumberArray>
作为友元,并且所有方法(包括构造函数和其他通常由编译器为您编写的东西)都是私有的。然后,您必须为_blocks
到NoteNumberArray
提供公共访问器/赋值器方法,但除了ItemSerializer<NoteNumberArray>
之外,没有人可以使用这些方法执行任何操作。
如果_blocks
仅由ItemSerializer
使用,则将其作为ItemSerializer
专业化的成员。如果不了解整个目的,我就看不出直接将这样的东西存储在NoteNumberArray
中有什么好处。
顺便说一句,通过避免在标识符上使用前导_
,您可以很容易地避免意外使用保留名称(例如_
后面跟着大写或全局命名空间中的前导_
)。
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- 将自定义 QMap 模板实例化以人类可读的形式保存在 QSettings 中