【问题标题】:C++ Overloaded operator doesn't modify original object (passed by reference)C++ 重载运算符不会修改原始对象(通过引用传递)
【发布时间】:2013-03-21 19:33:19
【问题描述】:

我正在创建一个子类向量,我想重载它的 = 运算符(最初是 + 运算符),但如果我将它的结果分配给一个引用,它不会修改原始对象。
似乎我遗漏了一些关于 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
}

【问题讨论】:

  • STL 容器是not meant to be subclassed,它们不提供虚拟析构函数。你不应该这样做。
  • reserve 不会调整矢量的大小。
  • I'm creating a subclass vector 为什么?
  • @juanchopanza:这看起来像是答案。
  • 使用调整大小而不是保留。我也同意你不应该从向量继承。

标签: c++ reference operator-overloading


【解决方案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() 函数。

【讨论】:

  • 你是对的。真正的代码(我在这里发布的代码是为了我的问题而高度缩减的 sn-p)涉及使用正态分布值初始化的矩阵(因此 n_rows 和 n_columns 被缩减为 n_elements)。
  • 经过一番测试,您的答案纠正了问题,我的解决方案中的问题是储备,它不像我想的那样工作(作为问题状态的cmets,我应该使用resize) .谢谢!
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2011-09-04
  • 2021-10-26
相关资源
最近更新 更多