2017-01-25 13 views
-1

割り当て演算子のオーバーロードの仕組みを正確に把握するのに苦労しています。私は、クラスmyClassを持っています:演算子のオーバーロードは代入演算子でどのように機能しますか?

私は多くのコードをスキップしましたが、あなたは一般的な考えを得ると思います。私がプログラムを実行すると、エラー "スレッド1:EXC_BAD_ACCESS"が表示されます。 +演算子と他の関数は正しく動作しているので、演算子=で何か問題があると仮定します。私は+と=演算子を組み合わせて+ =演算子を作成したいが、=演算子を使うことはできない。

タイプIのロジックに従わなければならないことに注意してください。つまり、割り当てはベクトルで行われなければならず、return_myClassを使用してmyClassオブジェクトとして返さなければなりません。

+1

'myClass plus = a + b;'は代入ではないため、代入演算子は呼び出されません。 – Oktalist

+0

'return_myClass'は非常に疑わしいです。 'myClass'はどこから参照するのですか?空のベクトルに対して 'return_vector [i]'を実行することはできません。 – aschepler

+0

'myClass plus + = a + b;'もコンパイルされません。 – aschepler

答えて

0

operator=の実装は完全に間違っています。 operator=(const T& rhs)のセマンティクスは、rhsの内容を新しい一時オブジェクトではなく*thisにコピーすることです。その後、*thisを返す必要があります。

今では、ローカル変数から構築されたオブジェクトへの参照が返されています。このオブジェクトは、すでに返されている参照であり、返される時刻はreturn_myclassです。

さらに、this->bit.size() > rhs.bit.size()の場合は、rhsの最後を読み取っています。コメントに記載されているように、あなたはreturn_vectorの最後を書き留めています。

vector<bool>ので、あなたが必要とするすべては

myClass& myClass::operator=(const myClass& rhs) = default; 
0

Aは非常に簡単です、すでに完璧な代入演算子を持っていますが、詳細はWhat is the copy-and-swap idiom?

を参照してください素朴な実装は、この

myClass& operator=(const myClass& other) 
{ 
    if (this != &other) // self-assignment test 
    { 
     bit = other.bit; 
    } 

    return *this; 
} 

ようになります。

関連する問題