2016-04-25 59 views
0

我試圖用+來添加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向量),這是構造函數生成的默認值。它出什麼問題了?謝謝!

+0

您的問題不在於發佈的代碼中,您能否發佈更多詳細信息以便我們運行代碼? – WhiZTiM

+1

我一定想看看複製構造函數。 –

+0

順便說一句...爲了提高效率,我建議你閱讀下面的內容:http://stackoverflow.com/a/414260/1621391 – WhiZTiM

回答

1

你的拷貝構造函數:

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) { 

} 

,或者甚至更好,然後你可以讓編譯器生成的拷貝構造函數本身,與同行爲。

+0

賓果!但dim(a.dim)是什麼意思? –

+0

以及您何時複製暗淡值?謝謝! –

+0

dim(a.dim)用值a.dim構造dim成員。在C++中,它是首選的,更優化的,有時也是必須的,以便像這樣初始化類成員。搜索「成員初始化列表」以獲取關於此語法的更多信息。 – rems4e