运算符重载为友元函数错误

Operator overloading as friend function error

本文关键字:函数 错误 友元 重载 运算符      更新时间:2023-10-16

我正在尝试使用 + 添加 2 个向量(数学向量)。这是我的代码:

class Vector{
    double v[Max_size];
    int dim;
public:
    int getDim() const;
    Vector();
    Vector(int n);
    Vector(const Vector& a);
    Vector add(const Vector&b);
    friend Vector operator+(Vector summand1, Vector summand2);
};

运算符重载:

Vector operator+(Vector summand1, Vector summand2){
    int dim1 = summand1.getDim();
    int dim2 = summand2.getDim();
    assert(dim1 == dim2);
    Vector sum(dim1);
    int i;
    for(i = 0; i < dim1; i++){
        sum.v[i] = summand1.v[i] + summand2.v[i];
    }
    return sum;
}

以及我如何使用它:

Vector m = v+t;

当我运行代码时,它总是显示 m 是 (0,0) (2D 向量),这是构造函数生成的默认值。怎么了?谢谢!

你的复制构造函数:

Vector::Vector(const Vector& a){
    dim = a.dim;
    Vector(dim);
}

正确设置dim成员的值,但没有其他副作用。

您应该具有以下代码的变体:

Vector::Vector(const Vector& a) : dim(a.dim) {
    std::copy(std::begin(a.v), std::end(a.v), v);
}

这实际上将复制参数中存在的数据,您将看到代码的正确行为:

// Copy constructor called here, but did not correctly copy the data before.
Vector m = v + t;

为了更好的(我打算更简单,更安全)Vector类,如果您可以访问至少符合C++11的编译器,则可以编写:

class Vector{
    std::array<double, Max_size> v; // Note the std::array here.
    int dim;
public:
    int getDim() const;
    Vector();
    Vector(int n);
    Vector(const Vector& a);
    Vector add(const Vector&b);
    friend Vector operator+(Vector summand1, Vector summand2);
};

std::array将处理所有事情,前提是您像这样编写复制构造函数:

Vector::Vector(const Vector& a) : v(a.v), dim(a.dim) {
}

或者,更好的是,您可以让编译器生成具有相同行为的复制构造函数本身。