簡體   English   中英

運算符重載為好友功能錯誤

[英]Operator overloading as friend function error

我正在嘗試使用+添加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) {

}

或者,甚至更好的是,您可以讓編譯器本身以相同的行為生成副本構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM