2

サブクラスベクトルを作成していて、その=演算子(元々は+演算子でした)をオーバーロードしたいのですが、その結果を参照に割り当てても、元のオブジェクトは変更されません。
C ++参照について何かが足りないようですが、それが何であるかわかりません。誰かが親切に私にエラーを指摘してくれたら、私はとても感謝しています。

これがコードです(G++を使用してUbuntu12でコンパイルされました)

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

1 に答える 1

0

このコード

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)
{}

これにより、長さの2つのメジャーがvector.size()ありn_elements、が同期しなくなっているという事実が修正されます。n_elements完全に取り除き、size()継承した関数を使用するだけです。

于 2013-03-21T19:38:32.483 に答える