首页 > 解决方案 > C++ - 如何保留一些类对象仅由某个类实例化

问题描述

我正在定义一个unique_id_generator 类,它有点像单例,即给定的type_id 只有一个实例。可以有许多不同的 type_id,但对于特定的 type_id,只有一个实例。现在我想确保 type_id = 0 进入一个非常具体的类。基本上只有特定的类可以使用 type_id = 0 ,然后其余的可以自由使用。我想知道通过哪种设计模式可以确保发生这种情况?我不想控制或管理一般给出的 type_ids。仅供参考,我已经在使用私有构造函数来阻止类的不受保护的实例化。

我无法控制谁先实例化 unique_id_generator。同样基于设计,我不想通过获取 type_id = 0 的特定类来路由对唯一 ID 的请求。

非常感谢任何想法/建议。

标签: c++design-patternssingleton

解决方案


我能想到的唯一解决方案是定义 2 个实例化方法。一公一私如下:

#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];
    }
};

推荐阅读