【发布时间】:2020-03-27 12:01:50
【问题描述】:
我的函数应该采用 ID 号(一个 int),但我注意到我不小心传递了不同事物的 ID 号,这破坏了我的程序。因此,我尝试执行以下操作以使其类型安全:
struct Number
{
int ID;
int operator =(const int& rhs) { ID = rhs; }
}
struct DogID : Number { }
struct CatID : Number { }
void functionTakingDogID(DogID ID) { }
void functionTakingCatID(CatID ID) { }
int main()
{
DogID dogID;
dogID = 5; // But the = operator overload isn't inherited
}
我创建类来保存数字的唯一原因是为了防止传递错误的 ID 号。我使用从 Number 继承的原因是,像 Dog 和 Cat 这样的任何类都可以被视为 ID 号(分配给)。
能够将 ID 号发送到函数但确保向其发送正确 ID 的最简洁的方法是什么?我不确定枚举类是否是一个选项,因为 ID 是在运行时给出的。
我还发现:
除赋值 (operator=) 之外的所有重载运算符都由派生类继承。
运算符 = 是唯一未继承的运算符重载的原因是考虑到派生类可能有额外的成员,它被认为风险太大吗?
【问题讨论】:
-
BOOST_STRONG_TYPEDEF适用于原语。我只是在阅读它,会在一秒钟内找到一个骗子 -
你需要
operator=吗?也许您可以在每个派生类的构造函数中传递 ID 并在那里进行验证。 -
@Yksisarvinen 严格来说,不需要 operator = 重载,我可以改为使用 dogID.ID = 5 而不是 dogID = 5。我只是重载了它,因此我可以将 dogID 视为一个数字在使它成为类型安全之前我会这样做。
标签: c++ type-safety