C++ 重载运算符不修改原始对象(通过引用传递)

C++ Overloaded operator doesn't modify original object (passed by reference)

本文关键字:引用 对象 运算符 重载 修改 原始 C++      更新时间:2023-10-16

我正在创建一个子类vector,我想重载它的=操作符(最初,它是+操作符),但是如果我将它的结果赋值给引用,它不会修改原始对象。
似乎我错过了关于c++引用的一些东西,但我不知道它是什么。如果有人能指出我的错误,我将非常感激。

下面是代码(在Ubuntu 12上使用g++编译)

#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
}

此代码

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()功能即可。