2013-03-21 79 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