是否可以在结构外编写自动转换操作符?

bri*_*dir 21 c++ casting operator-keyword

确切的情况是下一个:我在系统API定义结构CGPointCGSize,我希望能写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 & ).

接下来的问题是你为什么要这样做.如果设计师GLPointGLSize没有考虑到一个大小应该分配给一个点,那么为什么你觉得他们应该分配?通常,将类型保持分离是个好主意,因为这样可以使编译器检测到您可能在代码中犯的错误.

如果允许隐式转换GLSizeGLPoint,你可能会被错误类型是这样的:distance( point1, size2 )在这里你的意思distance( point1, point2 ),因为有一个转换,编译器会很高兴地转化和应用.然后你会看到奇怪的结果,你将花费相当多调试时间来确定逻辑错误的位置.

除非域对每个运算符在该上下文中的含义有一个非常明确的定义,否则我将不惜一切代价避免运算符重载.阅读代码的每个人都会立即理解GLPoint(1,2) + GLSize(5)代表什么而没有任何疑问或含糊之处吗?如果不是这样,如果人们会感到惊讶甚至怀疑,那么避免操作员重载并使用命名函数:( move_up( GLPoint&, GLSize )或者无论点+大小对你意味着什么)

  • +1,对转换运算符的陷阱的精彩评论 (2认同)
  • `你为什么要这么做。如果GLPoint和GLSize的设计人员不认为大小应该可分配给一个点,那么为什么您会认为它们应该可分配呢?即使它在QuadPart成员中包含一个,也不能隐式转换为LONGLONG。(I)希望编写一个转换运算符,以使其在函数和赋值中更容易使用“ PLI”类型,而不必在调用“ SetFilePointerEx”时使用额外的单独行。 (2认同)