2016-04-25 3 views
0

2つのベクトル(数学的ベクトル)を加算するために+を使用しようとしています。 0,0(私は、コードを実行すると演算子がfriend関数のエラーとしてオーバーロードされています

Vector m = v+t; 

は、それは常にメートルであることを示しています

class Vector{ 
    double v[Max_size]; 
    int dim; 
public: 
    int getDim() const; 
    Vector(); 
    Vector(int n); 
    Vector(const Vector& a); 
    Vector add(const Vector&b); 
    friend Vector operator+(Vector summand1, Vector summand2); 
}; 

演算子のオーバーロード:ここに私のコードです

Vector operator+(Vector summand1, Vector summand2){ 
    int dim1 = summand1.getDim(); 
    int dim2 = summand2.getDim(); 
    assert(dim1 == dim2); 
    Vector sum(dim1); 
    int i; 
    for(i = 0; i < dim1; i++){ 
     sum.v[i] = summand1.v[i] + summand2.v[i]; 
    } 
    return sum; 
} 

そして、私はそれを使用する方法)(2Dベクトル)。これはコンストラクタによって生成されたデフォルト値です。どうしたの?ありがとう!

+0

あなたの問題はコードに掲載されていないので、コードを実行するための詳細を投稿できますか? – WhiZTiM

+1

私は間違いなくコピーコンストラクタを見たいと思います。 –

+0

ところで...効率の理由から、私はあなたがこれを読むことをお勧めします:http://stackoverflow.com/a/414260/1621391 – WhiZTiM

答えて

1

あなたのコピーコンストラクタ:

Vector::Vector(const Vector& a){ 
    dim = a.dim; 
    Vector(dim); 
} 

は正しくdimメンバーの値を設定しますが、他のではない副作用があります。

あなたは、次のコードのバリエーションを持っている必要があります。

Vector::Vector(const Vector& a) : dim(a.dim) { 
    std::copy(std::begin(a.v), std::end(a.v), v); 
} 

これは実際にはパラメータのデータが存在コピーし、あなたがコードの正しい動作が表示されます。

// Copy constructor called here, but did not correctly copy the data before. 
Vector m = v + t; 

Vectorクラスでは、C++ 11に準拠したコンパイラにアクセスできる場合は、

と書くことができます(これにより、よりシンプルで安全です)。

Vector::Vector(const Vector& a) : v(a.v), dim(a.dim) { 

} 

または、より良い、あなたが同じで、コンパイラはコピーコンストラクタ自体を生成させることができます:std::arrayあなたはこのようなあなたのコピーコンストラクタを記述して、すべての世話をします

class Vector{ 
    std::array<double, Max_size> v; // Note the std::array here. 
    int dim; 
public: 
    int getDim() const; 
    Vector(); 
    Vector(int n); 
    Vector(const Vector& a); 
    Vector add(const Vector&b); 
    friend Vector operator+(Vector summand1, Vector summand2); 
}; 

動作。

+0

ビンゴ!しかし、dim(a.dim)の意味は何ですか? –

+0

といつあなたはdim値をコピーしましたか?ありがとう! –

+0

dim(a.dim)はdimメンバーをa.dimの値で構成します。 C++では、そのようなクラスメンバーを初期化することが推奨され、より最適化され、時には必須である場合があります。この構文の詳細については、「メンバー初期化リスト」を検索してください。 – rems4e

関連する問題