2013-03-21 36 views
2

我創建了一個子類向量,我想重載它的=運算符(最初,它是+運算符),但如果我將結果它以參考,它不會修改原始對象。
看來我錯過了一些關於C++引用的內容,但我不知道它是什麼。 如果有人能夠指出我的錯誤,我會非常感激。C++重載運算符不會修改原始對象(通過引用傳遞)

下面是代碼

#include <iostream> 
#include <vector> 

using namespace std; 
class myvector : public vector<long double> { 
    public: 
    int n_elements; 
    myvector(int elems){ 
     n_elements = elems; 
     reserve(n_elements); 
    } 
    myvector(int elems,long double initWith){ 
     n_elements = elems; 
     reserve(n_elements); 
     for (int i=0; i<n_elements; i++)  
      (*this)[i]=initWith; 
    } 
    myvector& operator= (const vector<long double>& v){ 
     for(int i = 0; i < n_elements; i++) 
      (*this)[i]=v[i]; 

     return *this;   
    } 
}; 

#define SIZE 200 
void fill(myvector& m){ 
    myvector temp = myvector(SIZE,1.0); 
    cout <<"0 "<< temp[0] << endl; // (0) returns 1 
    m = temp; 
    cout <<"1 "<< m[0] << endl; // (1) returns 12 
} 
int main(){ 
    myvector m = myvector(SIZE,12.0); 
    fill(m); 
    cout <<"2 "<< m[0] << endl; // (2) returns 12 
    myvector n = myvector(SIZE,1.0); 
    cout <<"3 "<< n[0] << endl; // (3) returns 1 
} 
+7

STL容器[不應該被分類](http://stackoverflow.com/questions/1647298/why-dont-stl-containers-have-virtual-destructors),並且它們不提供虛擬析構函數。你不應該這樣做。 – meagar 2013-03-21 19:35:38

+4

'reserve'不會調整矢量大小。 – juanchopanza 2013-03-21 19:37:19

+0

'我正在創建一個子類矢量'爲什麼? – 2013-03-21 19:39:39

回答

0

此代碼(用克++編譯在Ubuntu 12)

myvector(int elems,long double initWith){ 
    n_elements = elems; 
    reserve(n_elements); 
    for (int i=0; i<n_elements; i++)  
     (*this)[i]=initWith; 
} 

應該簡單地調用基類版本:

myvector(int const elems, long double const initWith) 
    : vector<long double>(elems, initWith) 
{} 

這將修復你有兩個長度量度的事實,vector.size()n_elements ,這是不同步的。完全擺脫n_elements並使用您繼承的size()函數。

+0

你說得對。真正的代碼(我在這裏發佈的代碼是爲了我的問題而大大減少的代碼片段)涉及矩陣(因此n_rows和n_columns減少爲n_elements)使用正態分佈值進行初始化。 – 2013-03-21 21:10:34

+0

經過一些測試後,您的答案可以解決問題,我的解決方案中的問題是保留區,並不像我想的那樣工作(如問題狀態中的註釋,我應該使用調整大小)。謝謝! – 2013-03-22 10:02:48