Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要设计建议以独占方式访问私有类状态_C++_Design Patterns - Fatal编程技术网

C++ 需要设计建议以独占方式访问私有类状态

C++ 需要设计建议以独占方式访问私有类状态,c++,design-patterns,C++,Design Patterns,我有一个简单的系统,涉及序列化用户对象。我有一系列专门的模板类,它们对每种类型都有不同的读/写操作: template<class T> class ItemSerializer; template<> class ItemSerializer<int> { public: static void store( int const& obj ) { } static void fetch( int& obj

我有一个简单的系统,涉及序列化用户对象。我有一系列专门的模板类,它们对每种类型都有不同的读/写操作:

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.
    }
};

如果
\u blocks
仅由
ItemSerializer
使用,只需将其作为
ItemSerializer
专门化的成员即可。如果不了解全部目的,我就看不出直接将这样的东西存储在
noteNumberRay
中有什么好处


作为旁注,通过避免标识符上的前导
,您可以轻松避免意外使用保留名称(例如在全局名称空间中的
后跟大写或前导
),使
ItemSerializer
成为
NoteNumberArray
的朋友不存在依赖性问题

如果您不希望
ItemSerializer
能够看到
noteNumberRay
的其他私有部分,我确实看到了访问问题


一种可能是将
\u块
包装到另一个类
noteNumberRaySerializerHelper
,该类将
项序列化器
作为朋友,所有方法(包括构造函数和其他通常由编译器为您编写的东西)都是私有的。然后,您必须将
\u块的公共访问器/变异器方法提供给
NoteNumberArray
,但是除了
ItemSerializer
之外,没有人可以使用这些方法来做任何事情。

将存在循环依赖关系
NoteNumberArray
需要为
friend类
语句定义
ItemSerializer
。另外,
ItemSerializer::store()
需要实现
NoteNumberArray
才能使用它,访问它的成员等。不,
NoteNumberArray
只需要您的
模板类ItemSerializer的前向声明用于友元声明
友元类ItemSerializer一切正常。
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
};