bri*_*dir 21 c++ casting operator-keyword
确切的情况是下一个:我在系统API定义结构CGPoint和CGSize,我希望能写my_point = my_size.我无法修改CGPointstruct,只能编写外部运算符.我可以编写二元运算符(+,-...),但operator=必须在struct内部声明.那还有其他解决方案吗?
Dav*_*eas 27
要使表达式a = b;编译,您需要具有operator=类型a的类型b,或者可以从中隐式转换的类型b.
第一种情况被排除,因为operator=必须是该类的成员,并且由于您无法修改,GLPoint因此您无法添加GLPoint& GLPoint::operator=( GLSize ).
第二种情况遇到了同样的问题.从GLSizeto到的隐式转换GLPoint可以作为GLPoint(排除)中的隐式构造函数实现,也可以作为成员operator GLPoint()实现GLSize,需要修改GLSize.转换也不能作为自由函数添加.
替代使用非运算符的语法,作为加入游离函数assign(或copy): GLPoint& assign( GLPoint&, GLSize const & ).
接下来的问题是你为什么要这样做.如果设计师GLPoint并GLSize没有考虑到一个大小应该分配给一个点,那么为什么你觉得他们应该分配?通常,将类型保持分离是个好主意,因为这样可以使编译器检测到您可能在代码中犯的错误.
如果允许隐式转换GLSize到GLPoint,你可能会被错误类型是这样的:distance( point1, size2 )在这里你的意思distance( point1, point2 ),因为有一个转换,编译器会很高兴地转化和应用.然后你会看到奇怪的结果,你将花费相当多的调试时间来确定逻辑错误的位置.
除非域对每个运算符在该上下文中的含义有一个非常明确的定义,否则我将不惜一切代价避免运算符重载.阅读代码的每个人都会立即理解GLPoint(1,2) + GLSize(5)代表什么而没有任何疑问或含糊之处吗?如果不是这样,如果人们会感到惊讶甚至怀疑,那么避免操作员重载并使用命名函数:( move_up( GLPoint&, GLSize )或者无论点+大小对你意味着什么)