我有这个问题:我编写了一个C ++类,该类代表一个具有给定地址的远程设备(总线上可以有多个设备,每个设备都有不同的地址)。地址在对象创建时作为构造函数的参数传递给类。该类的每个实例应具有不同的地址,如果您尝试创建具有相同地址的两个对象,则该类应拒绝它(作为一种单例,但带有一个参数)。我该如何解决?谢谢!
答案 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或创建一些对象如果传递的地址等于退出的地址,则是一种错误。
如果您不想将对象存储在矢量中,则可以创建仅包含地址的矢量。