C++ - 如何保留一些 class 对象仅由某个 class 实例化
C++ - How to reserve some class objects to only be instantiated by a certain class
我正在定义一个 unique_id_generator class,这是一种单例,即给定的 type_id 只有一个实例。可以有许多不同的 type_id,但对于特定的 type_id,只有一个实例。
现在我想确保 type_id = 0 转到非常具体的 class。基本上就是那个特定的 class 可以使用 type_id = 0 然后其余的可以自由使用。
我想知道通过哪种设计模式可以确保发生这种情况?
我不想控制或管理一般给出的 type_ids。
仅供参考,我已经在使用私有构造函数来阻止 class.
的未受保护的实例化
我无法控制谁先实例化 unique_id_generator。同样基于设计,我不想通过获取 type_id = 0.
的特定 class 路由对唯一 ID 的请求
非常感谢thoughts/advice。
我能想到的唯一解决方案是定义2个实例化方法。一个public和一个私人如下:
#define EXCLUSIVE_CNT 1
class UniqueID
{
public:
friend class MySpecialClass;
static UniqueID * GetInstance(int type_id)
{
assert(type_id >= EXCLUSIVE_CNT);
return Instantiate(type_id);
}
private:
int type_id_;
int seq_id_;
std::map<type_id, UniqueID*> type_to_obj_map_;
UniqueID(int type_id)
{
type_id_ = type_id;
seq_id_ = 0;
}
static UniqueID * GetExclusiveInstance(int type_id)
{
assert(type_id < EXCLUSIVE_CNT);
return Instantiate(type_id);
}
static UniqueID * Instantiate(int type_id)
{
if(type_to_obj_map_.find(type_id) == type_to_obj_map_.end())
{
type_to_obj_map_[type_id] = new UniqueID(type_id);
}
return type_to_obj_map_[type_id];
}
};
我正在定义一个 unique_id_generator class,这是一种单例,即给定的 type_id 只有一个实例。可以有许多不同的 type_id,但对于特定的 type_id,只有一个实例。 现在我想确保 type_id = 0 转到非常具体的 class。基本上就是那个特定的 class 可以使用 type_id = 0 然后其余的可以自由使用。 我想知道通过哪种设计模式可以确保发生这种情况? 我不想控制或管理一般给出的 type_ids。 仅供参考,我已经在使用私有构造函数来阻止 class.
的未受保护的实例化我无法控制谁先实例化 unique_id_generator。同样基于设计,我不想通过获取 type_id = 0.
的特定 class 路由对唯一 ID 的请求非常感谢thoughts/advice。
我能想到的唯一解决方案是定义2个实例化方法。一个public和一个私人如下:
#define EXCLUSIVE_CNT 1
class UniqueID
{
public:
friend class MySpecialClass;
static UniqueID * GetInstance(int type_id)
{
assert(type_id >= EXCLUSIVE_CNT);
return Instantiate(type_id);
}
private:
int type_id_;
int seq_id_;
std::map<type_id, UniqueID*> type_to_obj_map_;
UniqueID(int type_id)
{
type_id_ = type_id;
seq_id_ = 0;
}
static UniqueID * GetExclusiveInstance(int type_id)
{
assert(type_id < EXCLUSIVE_CNT);
return Instantiate(type_id);
}
static UniqueID * Instantiate(int type_id)
{
if(type_to_obj_map_.find(type_id) == type_to_obj_map_.end())
{
type_to_obj_map_[type_id] = new UniqueID(type_id);
}
return type_to_obj_map_[type_id];
}
};