0

C++ .NET で Object::Equals をオーバーライドしようとしていますが、いくつかの問題が発生しています。

virtual bool IState::Equals(Object^ o) override{
        if (o->GetType() == IState::typeid){
            IState^ s = (IState^) o;
            if (s->type == this->type &&
                s->target_state == this->target_state &&
                s->current_state == this->current_state){
                return true;
            }
            else{
                return false;
            }
        }
        return false;
    }

このコードは、o が IState の場合に正常に機能します。ただし、State を持つ IState から継承します。同じ内容の State を渡すと、Equals 関数が true を返すようにしたいと思います。

State は IState と同じではありませんが、同じ基本クラスから継承されているかどうかを確認できる演算子はありますか? 演算子の typeid をオーバーロードすると役立つかもしれませんが、それには多くの問題があるようです

4

4 に答える 4

4

リフレクションの使用はオプションですか? その場合は、Type::IsAssignableFrom()メソッドとType::BaseTypeプロパティを見てください。

于 2009-07-07T19:43:05.280 に答える
3

これを行う正しい方法は、dynamic_cast を使用して nullptr を確認することです。

virtual bool IState::Equals(Object^ o) override {
    IState^ s = dynamic_cast<IState^>(o);
    if (s != nullptr) {
        ...
    }
    return false;
}

使用した C スタイルのキャスト (これらの BTW は避けてください) は実際には safe_cast を実行し、失敗すると InvalidCastException をスローするため、dynamic_cast を明示的に記述する必要があります。

于 2009-07-07T20:32:55.040 に答える
1

わかりました、私はそれを機能させることができました

->GetType() の後に ->BaseType() がありませんでした

ここに作業バージョンがあります

virtual bool IState::Equals(Object^ o) override{
        if (o->GetType()->BaseType() == IState::typeid){
                IState^ s = (IState^) o;
                if (s->type == this->type &&
                        s->target_state == this->target_state &&
                        s->current_state == this->current_state){
                        return true;
                }
                else{
                        return false;
                }
        }
        return false;
    }

あなたの時間、サポート、そして献身に感謝します=)

于 2009-07-07T19:44:08.773 に答える
0

typeid 演算子を使用するのはどうですか? http://msdn.microsoft.com/en-us/library/fyf39xec(VS.80).aspx

于 2009-07-07T19:37:09.753 に答える