2009-04-04 9 views
0

私は代入演算子をオーバーロードしようとしていますが、大丈夫ならいくつかの問題をクリアしたいと思います。オーバーロード= C++で

私はメンバークラス以外の機能を持っています、bool operator==(const MyClass& obj1, const myClass& obj2)は私のクラスの中に定義されています。

明白な理由から私のプライベートメンバーのいずれにも参加できません。

だから私がする必要があるのは、代入演算子をオーバーロードすることです。また、非メンバ関数で代入を行います。言ったことで

、私は次の操作を実行する必要があると思う:

  1. 私の関数を使用してstrcpyまたはstrdupを使用して情報をコピーします。私はstrcpyを使用しました。
  2. 代入演算子、bool MyClass :: operator =(const MyClass & obj1)に移動します。
  3. 関数オーバーロード(==)に行き、obj2をobj1に割り当てます。

私はコピーコンストラクタを持っていないので、私はこれらにこだわっている:

class Class 
{ 
private: 
m_1; 
m_2; 
public: 
.. 
}; 

void Class::Func1(char buff[]) const 
{ 
    strcpy(buff, m_1); 
    return; 
} 
void Class::Func2(char buff[]) const 
{ 
    strcpy(buff, m_2); 
    return; 
} 

bool Class& Class::operator=(const Class& obj) 
{ 
    if (this != &obj) // check for self assignment. 
    { 
     strcpy(m_1, obj.m_1); 
     // do this for all other private members. 
    } 
    return *this; 
} 

bool operator== (const Class& obj1, const Class& obj2) 
{ 
     Class MyClass1, MyClass2; 
    MyClass1 = obj1; 
    MyClass2 = obj2; 

     MyClass2 = MyClass1; 
     // did this change anything? 
// Microsofts debugger can not get this far. 
    return true; 
} 

だから、あなたはおそらく、私は完全にこのオーバーロードで迷ってしまいました、言うことができるように。任意のヒント?完成したバージョンには同じオペレータがオーバーロードされていますが、::でしかないので、プライベートメンバーはスコープを失うことはありません。私は割り当てを真として返し、それはmainで働く。私の本にある例はどれですか。

代入演算子のオーバーロードが発生し、operator==非メンバ関数の変換が実行されますか?そのステップを完了した後、私はメインでお互いにオブジェクトを割り当てることができますか?

答えて

0

私はあなたが2つのオブジェクトを比較したいと思っています。その場合、クラス "Class"の演算子==をオーバーロードすることができます。代入演算子は必要ありません。

class Class 
    { 
    public: 
     Class(int i) : m_i(i){} 

     bool operator==(const Class& rhs) 
     { 
      return m_i == rhs.m_i; 
     } 
    private: 
     int m_i; 

    }; 


int main() 
{ 
    Class t1(10), t2(10); 
    bool b = (t1 == t2); 
} 
6

Op ==は代入演算子ではありません。 T & Op =(const T &)です。

bool演算子==(const T & lhs、const T & rhs)は、2つのTsを比較する演算です。 lhsがrhsに等しい場合は、trueを返します。

7

あなたは実際に何を達成しようとしているのかについていくつかの混乱があります。まず、代入演算子operator =は、あるインスタンスから別のインスタンスに値をコピーするためのものです。

Class & operator=(const Class &rhs) 
{ 
    // copy the members 

    return *this; 
} 

比較演算子operator ==は、2つのインスタンスの比較を行うためのものです:あなたがチェーンの割り当てができるように、代入演算子の戻り値は、ほとんど常にコピーのターゲットへの非一定の基準です。

boolean operator==(const Class &rhs) const 
{ 
    // check if they are equal 
    return something; 
} 

混乱はなぜあなたは周りの値をコピーしようとしている、または多分比較演算子でインスタンスに割り当てている:それらが等しい場合は、ブールtrueを返しますか?

+0

代入演算子は右から左に連想するので、a = b = cは(a =(b = c))と評価されているので、大丈夫です。 const参照を返します。 – Ismael

+0

これは本当ですが、効果的なC++(Scott Meyers)は、C++標準では非const参照を返すべきだと言っています。これは、intsのようなもののために実際には(a = b)= cである組み込み関数の(奇妙な)動作と互換性を持たせるためです。 –

0

質問を正しく理解したかどうかはわかりません。しかし、非メンバー関数を使用して等価性をチェックしようとしていて、クラスのプライベートメンバーにアクセスできないためにのみこれを行うことができない場合は、非メンバー関数をフレンド関数として宣言して使用することができます

class Test 
{ 
public: 
    Test(int i) : m_i(i){} 
private: 
    int m_i; 

    friend bool operator==(Test& first, Test& second); 
}; 

bool operator==(Test& first, Test& second) 
{ 
    return first.m_i == second.m_i; 
} 

int main() 
{ 
    Test t1(10), t2(10); 
    bool b = (t1 == t2); 
} 
+0

Friendは良い選択肢ではないと私は信じています。 –

+0

OPで==を書くだけで十分です、そうですか? –

+0

比較演算子を実装したい場合は、Friendを使用します。詳細を公開するアクセサー(ゲッター)とは異なり、(詳細を隠すことによって)カプセル化が強制されます。しかし、 "const" –

関連する問題