1

代入演算子をオーバーロードしようとしていますが、問題がなければいくつか解決したいと思います。

bool operator==( const MyClass& obj1, const myClass& obj2 )クラスの外で定義された非メンバー関数があります。

明らかな理由で、プライベート メンバーのいずれにもアクセスできません。

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

そうは言っても、次のことを行う必要があると思います。

  1. my 関数を使用し、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;
}

おそらくおわかりのように、私はこの過負荷で完全に迷っています。任意のヒント?同じ演算子を のみでオーバーロードする完成版がある::ので、プライベート メンバーはスコープを失いません。割り当てを true として返すと、で動作しmainます。これは私の本にある例です。

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

4

4 に答える 4

7

ここにはいくつかの明らかな間違いがあり、実際に達成しようとしていることについて混乱があります。まず、代入演算子operator =は、あるインスタンスから別のインスタンスに値をコピーするためのものです。割り当て演算子の戻り値は、ほとんどの場合、コピーのターゲットへの非定数参照であるため、割り当てを連鎖させることができます。

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

  return *this;
}

比較演算子operator ==は、2 つのインスタンスの比較を実行するためのものです。それらが等しい場合、ブール値の true を返します。

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

混乱しているのは、なぜ値をコピーしようとしているのか、または比較演算子でインスタンスに代入しようとしているのかということです。

于 2009-04-04T07:02:28.977 に答える
6

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

bool operator==(const T& lhs, const T& rhs) は、2 つの T を比較する操作です。コード化する「等しい」の定義に関係なく、lhs が rhs と等しい場合は true を返します。

于 2009-04-04T06:58:57.627 に答える
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);
}
于 2009-04-04T07:42:54.777 に答える
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);
}
于 2009-04-04T07:06:27.890 に答える