满足特定条件时如何限制对象的创建

时间:2019-02-23 07:48:27

标签: c++

我有这个问题:我编写了一个C ++类,该类代表一个具有给定地址的远程设备(总线上可以有多个设备,每个设备都有不同的地址)。地址在对象创建时作为构造函数的参数传递给类。该类的每个实例应具有不同的地址,如果您尝试创建具有相同地址的两个对象,则该类应拒绝它(作为一种单例,但带有一个参数)。我该如何解决?谢谢!

2 个答案:

答案 0 :(得分:5)

一种可能的方法是跟踪已经在类级别使用的地址:

class Monopoly {
    Address addr;
    static std::unordered_set<Address> taken;
public:
    Monopoly(Address const &a): addr(a) {
        if(!taken.insert(a).second) {
            throw std::logic_error(a.toString() + " is already in use");
        }
    }
    Monopoly(Monopoly &&) = default;
    Monopoly(Monopoly const &) = delete;
    Monopoly &operator=(Monopoly &&) = default;
    Monopoly &operator=(Monopoly const &) = delete;
    ~Monopoly() { taken.erase(addr); }
};

答案 1 :(得分:0)

如果我正确理解了您的问题,则您有一个带有成员变量(地址)的类,该成员变量由作为参数传递给构造函数的值初始化,并且如果其他对象已经具有该对象,则您不希望构建该对象。您通过的地址。

您可以通过将所有对象存储在向量中来解决此问题,然后使用for循环将传递的地址与向量中每个已存在对象的每个地址进行比较,并引发异常,或者使用assert或创建一些对象如果传递的地址等于退出的地址,则是一种错误。

如果您不想将对象存储在矢量中,则可以创建仅包含地址的矢量。