/ /演算子がfriend関数のエラーとしてオーバーロードする - c ++、operator-keyword

オペレータが友人機能エラーとしてオーバーロードする - c ++、operator-keyword

私は2つのベクトル(数学的なベクトル)を追加するために+を使用しようとしています。ここに私のコード:

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

そして私はそれをどのように使用するのですか?

Vector m = v+t;

コードを実行すると、常にmが(0,0)(2Dベクトル)であることが示されます。これはコンストラクタによって生成されるデフォルト値です。何が間違っていますか?ありがとう!

回答:

回答№1は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に準拠したコンパイラにアクセスできる場合は、次のように書くことができます:

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

std::array 次のようにコピーコンストラクタを記述すれば、すべてを処理します:

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

}

あるいは、同じように、コンパイラにコピーコンストラクタ自体を生成させることもできます。