1

現在、C++ でラベル付けサポート用のクラスを実装しています。ただし、オーバーロードされた演算子と isEqual メソッドの異なる動作について少し混乱しています。

class Lbl
{
public:
    virtual bool operator == (const Lbl* l) const = 0;
    virtual bool isEqual (const Lbl* l) const = 0;
};

class SubLbl : public Lbl
{
public:
    SubLbl(){}

    bool operator == (const Lbl* l) const {return true;}
    bool isEqual (const Lbl* l) const {return true;}
};

int main(int argc, char** argv) {
    SubLbl* l1 = new SubLbl();
    SubLbl* l2 = new SubLbl();

    cout << (l1 == l2) << endl;
    cout << (l1->isEqual(l2)) << endl;
    return 0;
}

出力:

0
1

どうしてこれなの?オペレーターもオーバーロードするには、これをどのように変更する必要がありますか? 「isEqual」メソッドにアクセスできるようにするために「public」を継承する必要があるのはなぜですか? それとも、これまでに使用したことのない (そして知らない) テンプレートの典型的な状況ですか?

私がやっていることは、オブジェクトに付けることができるさまざまなタイプのラベルをサポートするために、さまざまな SubLbl クラスを実装することです。すべて (SubLbl クラス) は Lbl クラスから継承し、独自の等値定義により等値演算子をオーバーロードする必要があります (int 比較は 2 つの複雑なオブジェクトの比較とは異なり、さらに double 比較とは異なります)。後で(プログラムで)現在どのようなサブラベルを見ているのか知りたくありません。それらが等しいかどうかを知りたいだけです。

4

2 に答える 2

1

これです:

l1 == l2

ポインターを比較しています。これは、l1とのアドレスがl2同じ場合にのみ当てはまります。

これです

l1->isEqual(l2)

を返すメンバー関数の呼び出しを実行していますtrue

于 2013-06-25T06:34:28.250 に答える
1

継承と演算子のオーバーロードについて話しているため、よく読んでください。これはかなりトリッキーな答えです。

私の推測では、オブジェクトがまったく同じ種類のクラスであることがわからない場合は、オブジェクトを operator== と比較すべきではありません。SubLbl 内でのみ定義する必要があります。

bool operator == (const SubLbl& l) const {return _something_;}

SubLbl型のオブジェクトを引数として指定しました。operator==また、特に仮想の場合は、Lbl で仮想を定義することは避けます。一方、関数 isEqual は問題ない可能性があります。

ここで、さまざまなソリューションのインスピレーションを見つけることができます: Making operator<< virtual?

これは私の古い答えです

最初のケースでは、定義した演算子を呼び出していませんが、2 つのポインターが同じオブジェクトを指しているかどうか、または同じ値を持っているかどうかを確認しています。

オペレーターを呼び出すには、次のように入力する必要があります。

cout << (*l1 == l2) << endl;

しかし、演算子を定義した方法はお勧めできません。たとえば、次のように定義する必要があります。

bool operator == (const Lbl& l) const {return _something_;}

そして電話する

cout << (*l1 == *l2) << endl;
于 2013-06-25T06:35:13.647 に答える