2013-10-31 83 views
1

我想找到一個簡單的示例程序,重載數學矢量的以下運算符。C++矢量運算符重載

Constructor // create 

= (equals)  // assign 

+; -; +=; -= // add sub 

*; /; *=; /= // multi divide 

++; -- // plus minus 

== // compare 
>; >= 
<; <= 

[] // access a value 

不能找到任何好的簡單教程。我強調簡單,因爲我現在只學習這些東西。如果有人能夠聯繫我,或者更好地爲一個操作員編程一個簡單的過載,那麼這將是一個不可思議的例子!

+0

當你說「數學矢量」時,它的實際類型是什麼? –

+0

是否這樣? http://www.cplusplus.com/doc/tutorial/classes2/ – JustinDanielson

+0

在uni的未來工作中,我被告知我們將使用「數學向量,而不是STL向量」,因此不確定它們是相同的還是不同的。 – SharpCode

回答

5

當你編寫操作符時,有幾件事情需要知道,這些操作符並不經常與其他函數一起使用。

的分配運營商,例如,將返回*這一點,因爲你改變了矢量值:

class v { 
public: 
    double x_, y_; 
    v& operator += (const v& rhs) 
    { 
    _x += rhs._x; 
    _y += rhs._y; 
    return *this; 
    } 
}; 

另一個有趣的一個,前++,後++是不同的未使用的僅僅是因爲參數:

class v { 
public: 
    double x_, y_; 
    v& operator ++(); // ++v 
    v& operator ++ (int); // v++ 
}; 

「等於」(賦值)是另一個當你使用指針時很棘手。對於一個矢量,它通常不會是一個問題,但如果你定義一個矢量V,並將其分配給自己,你必須要小心:

class v { 
public: 
    double x_, y_; 
    v& operator = (const v& rhs) 
    { 
    if(this != &rhs) 
    { 
     x_ = rhs.x_; 
     y_ = rhs.y_; 
    } 
    } 
}; 

在你的情況下,如果()肯定會沒有用處,但是想想做這樣的事情:

delete p_; 
    p_ = new foo; 
    p_->x_ = rhs.p_->x_; 

如果& RHS ==這一點,那麼delete p_刪除RHS指針!這意味着在第三行訪問它是一個錯誤。

其餘的應該很容易處理。比較運算符返回布爾並常量:

class v { 
public: 
    double x_, y_; 
    bool operator == (const v& rhs) const 
    { 
    return x_ == rhs.x_ && y_ == rhs.y_; 
    } 
}; 

除[]操作符。有兩種版本:

class v { 
public: 
    // I would imagine you'd use an array but as a simple example... 
    double x_, y_; 
    double operator [] (int idx) const 
    { 
    return idx == 0 ? x_ : y_; 
    } 
    v_ref operator [] (int idx) 
    { 
    v_ref v(this, idx); 
    return r; 
    } 
}; 

正如您所看到的,[]運算符的非常量版本返回一個引用。這是必要的,所以你可以寫這樣的東西:

r[3] = 7.3; 

r [3]返回該引用,然後用7.3調用引用的分配作爲參數。

class v_ref 
{ 
public: 
    v *p_; 
    int i_; 
    v_ref(v *p, int i) 
    : p_(p), i_(i) 
    { 
    } 
    operator = (double q) 
    { 
    // again, I suppose you'd use an array instead! 
    if(i_ == 0) 
    { 
     p_->x_ = q; 
    } 
    else 
    { 
     p_->y_ = q; 
    } 
    } 
}; 

假設你想要一些安全性,矢量指針可以利用一個引用計數器,所以你知道,如果一個主矢量對象獲得其所有的參考對象之前刪除...

另注:我會假設你的構造函數將分配一個double數組(或者使用std :: vector類型......)如果你使用new,記得要在析構函數中刪除,這就是賦值運算符中的if()非常重要。

+0

如何創建一個矢量類對象,但要實現這個東西? – SharpCode

+1

@ user2495847所以你甚至沒有你的'vector'類呢?這聽起來像你需要從一些基本的C++類教程開始。 – crashmstr

+0

@crashmstr我被要求創建一個Vector類對象,所以這意味着要創建一個像這樣的向量...使用上面顯示的代碼或矢量或是否意味着... class myVector:std :: vector {。 ..};那類的東西? – SharpCode