gpt4 book ai didi

c++ - 是否可以在结构之外编写自动转换运算符?

转载 作者:IT老高 更新时间:2023-10-28 21:46:32 25 4
gpt4 key购买 nike

具体情况如下:我在系统 API 结构中定义了 CGPointCGSize,我希望能够编写 my_point = my_size。我无法修改 CGPoint 结构,只能编写外部运算符。我可以编写二元运算符(+-、...),但 operator= 必须在结构中声明。那么有没有其他的解决方案呢?

最佳答案

要使表达式 a = b; 编译,您需要有一个 a 类型的 operator= 接受一个元素b 的类型,或从 b 隐式转换的类型。

第一种情况排除了,因为operator=必须是类的成员,又因为不能修改GLPoint所以不能添加GLPoint&GLPoint::operator=( GLSize ).

第二种情况也有同样的问题。从 GLSizeGLPoint 的隐式转换可以实现为 GLPoint 中的隐式构造函数(排除),或作为成员 operator GLSize中的GLPoint(),需要修改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 ) (或任何 point+size 对你来说意味着)

关于c++ - 是否可以在结构之外编写自动转换运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6120841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com