2016-10-22 13 views
-2

私はちょっと難しいことにこれを必要とするので、これがどのように機能するのかを理解するためのミニプログラムを作成するだけですが、この作業を行うことはできません。セットのオーバーロード演算子

私は演算子オーバーロードを定義する必要がありますが、私は、彼らが set<set<a>>

の二つのオブジェクトであるため、コンパイルした場合、あなたはそれが彼がmyset == myset2を比較することはできませんと私は考えていることがわかり、大きなエラーが表示されます方法を知ってはいけないと思います

それは、デフォルトでは、コンパイラによって生成される(デフォルトoperator=(const T&)operator=(T&&)を除く)いいえ演算子演算子!==

#include <set> 
using namespace std; 

class a{ 
private: 
    int a_; 
public: 
    int get_a() const{ return a_; } 
    void set_a(int aux){ a_=aux;} 
    bool operator < (const a& t) const{ 
     return this->get_a() < t.get_a(); 
    } 
}; 


class b{ 
private: 
    set<set<a> > b_; 
public: 
    void set_(set<a> aux){ b_.insert(aux); } 
    //Overload operators? 
}; 


int main(){ 
    b myset;  
    b myset2; 

    set<a> subset1; 
    set<a> subset2; 

    a myint; 

    myint.set_a(1); 
    subset1.insert(myint); 

    myint.set_a(2); 
    subset1.insert(myint); 

    myint.set_a(3); 
    subset1.insert(myint); 

    myint.set_a(5); 
    subset2.insert(myint); 

    myint.set_a(6); 
    subset2.insert(myint); 

    myint.set_a(7); 
    subset2.insert(myint); 

    myset.set_(subset1); 
    myset.set_(subset2); 

    myset2.set_(subset1); 
    myset2.set_(subset2); 


    if(myset == myset2){ 
     cout << "They are equal" << endl; 
    } 

    if(myset != myset2){ 
     cout << "They are different" << endl; 
    } 

    b myset3; 

    myset3 = myset2; //Copy one into other 

} 
+0

ほとんど正しいです。適切な演算子を実装しない限り、( '=='、 '!='、 '<'、etc ...)オブジェクトを比較することはできません。デフォルト代入演算子が生成されるので、依然として( '=')を代入することができます。このデフォルトの '='は、すべての場合にあなたが望むことをしないかもしれません。 [3のルールとは何ですか?](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)を参照してください。すべての場合、デフォルトの '=それを避ける方法。 – user4581301

答えて

0

次の演算子を指定する必要があなたのコードが動作するためには(注意:これらはデフォルトで作成されていない)

class a{ 
private: 
    int a_; 
public: 
    int get_a() const{ return a_; } 
    void set_a(int aux){ a_=aux;} 

    /* needed for set insertion */ 
    bool operator < (const a& other) const { 
     return this->get_a() < other.get_a(); 
    } 

    /* needed for set comparison */ 
    bool operator == (const a& other) const { 
     return this->get_a() == other.get_a(); 
    } 
}; 



class b{ 
private: 
    set<set<a> > b_; 
public: 
    void set_(set<a> aux){ b_.insert(aux); } 

    /* needed, because myset == myset2 is called later in the code */ 
    bool operator == (const b& other) const { 
     return this->b_ == other.b_; 
    } 

    /* needed, because myset != myset2 is called later in the code */ 
    bool operator != (const b& other) const { 
     return !(*this == other); 
    } 
}; 

あなたはまたhttp://en.cppreference.com/w/cpp/container/setを見て、std::setが内部で使用する他のどのような演算子を見るべきですその要素に

0

に同じ言わないだろう。これらを明示的に定義する必要があります。

class b{ 
private: 
    set<set<a> > b_; 
public: 
    void set_(set<a> aux){ b_.insert(aux); } 
    //Overload operators? 

    bool operator==(const b& other) const { 
     return b_ == other.b_; 
    } 

    bool operator!=(const b& other) const { 
     return b_ != other.b_; 
    } 
}; 

ただし、これでは解決できません。比較演算子はstd::set<T>に対して既に定義されていますが、演算子がTの場合にのみ動作します。したがって、bクラスと同じ方法でaクラスのoperator==operator!=を定義する必要があります。

関連する問題