【问题标题】:Operator overloading leads to incorrect results [duplicate]运算符重载导致不正确的结果[重复]
【发布时间】:2021-10-05 17:41:56
【问题描述】:

我有一个 Vector3 类,它的 + 和 * 运算符重载如下:

Vector3& operator+ (Vector3& v1, Vector3& v2)
{
    Vector3 sum = Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
    static Vector3& ref = sum;
    return ref;
}

Vector3& operator* (Vector3& v1, double value)
{
    Vector3 product = Vector3(v1.x * value, v1.y * value, v1.z * value);
    static Vector3& ref = product;
    return ref;
}

Vector3& operator* (double value, Vector3& v1)
{
    Vector3 product = Vector3(v1.x * value, v1.y * value, v1.z * value);
    static Vector3& ref = product;
    return ref;
}

但是当计算 2 个向量 v1 和 v2 的线性组合时,我得到 2 个不同的结果,分别与一行进行:

#include <iostream>
#include "Vector3.h"
using namespace std;

int main()
{
    Vector3 v1 = Vector3(1.0, 2.0, 3.0);
    Vector3 v2 = Vector3(2, 2, 2);

    Vector3 v3 = v1 * -1;
    Vector3 v4 = v2 * 1.2;

    cout << v3 + v4 << endl;

    cout << (v1 * -1.0) + (v2 * 1.2) << endl;

    return 0;
}

输出:

(1.4, 0.4, -0.6)
(-2, -4, -6)

【问题讨论】:

    标签: c++ vector operator-overloading


    【解决方案1】:

    你的代码有undefined behavior,一切皆有可能。引用ref 和返回的引用引用了本地对象sumproduct,它们会在退出函数时被销毁,使返回的引用悬空。对它们的取消引用会导致 UB。

    operator+operator* 应该按值返回。

    Vector3 operator+ (const Vector3& v1, const Vector3& v2)
    {
        return Vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
    }
    
    Vector3 operator* (const Vector3& v1, double value)
    {
        return Vector3(v1.x * value, v1.y * value, v1.z * value);
    }
    
    Vector3 operator* (double value, const Vector3& v1)
    {
        return Vector3(v1.x * value, v1.y * value, v1.z * value);
        // or 
        // return v1 * value;
    }
    

    顺便说一句:我将Vector3 作为参考的运算符更改为const,它也适用于临时对象。

    【讨论】:

    • 我最初确实以这种方式实现了它,但是这导致了链接操作会导致甚至无法理解的非常讨厌的错误消息的问题。例如这一行: cout
    • @StealthyPanda 很可能是因为您的运算符版本通过非常量引用获取参数,这也是错误的。
    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多