2016-08-03 8 views
1

私は問題がありますが、正しく解決したかどうか、またはより正確な方法があるかどうかはわかりません。等価演算子のオーバーロードでは、Iを導出するベースオブジェクトにconst参照をキャストする必要があり、今派生へのconstベース参照のキャスト

class Data_Base 
{ 
... 
} 

class Data_Error : public Data_Base 
{ 
... 
} 

は今、私は、2つのクラス(および他から1継承)を有しますオブジェクトを再度テストするために、オブジェクトを再配置します。現時点では私はこれをやっている:

bool Data_Error::operator==(const Data_Base &other) const 
{ 
    if (Data_Base::operator !=(other)) 
     return false; 

    const Data_Error &other_cast = (const Data_Error &)other; 

    ... More tests on other_cast ... 
} 

、それが実装されているので、キャストの瞬間にother変数は、Data_Base==オペレータ(および!=オペレータ以来、Data_Error以外の何かであることがありません==の否定のように)は、派生オブジェクトのタイプもチェックするので、タイプが正しい場合にのみそのラインに到達します。

これで問題はありますか? 「より正確な」ソリューションはありますか?

私はQt(5.7)で作業していますので、「もっとQTish」ソリューションがありますか?

+0

なぜ、 'Data_Error'と' Data_Base'子孫を比較しますか?階層内の異なるブランチの型を比較す​​るには、どのような意味がありますか? 'bool Data_Error :: operator ==(const Data_Error&other)const'に固執するだけです。 – StoryTeller

+0

@StoryTeller基本型のリストがある場合、そのアイテムのいくつかがそれと等しいかどうかを調べるために反復したいと思います。私は単にすべての項目に対して==を呼び出します。関数では、型が同じかどうかをチェックし、そうでなければ等しいとは限りません。しかし、この目的のために、他の型は基本型でなければなりません。それ以外の場合、プログラムは2つの異なる枝を比較する方法を知らない – frarugi87

+0

'演算子=='は仮想ですか?そうでない場合、期待どおりに動作しません。 – StoryTeller

答えて

1

Cスタイルのキャストを避ける必要があります。あなたはなぜhereを見つけることができます。代わりに、静的なキャストを使用する必要があります。

const Data_Error &other_cast = static_cast<const Data_Error &>(other); 

または動的キャストを他の実行時にチェックするために効果的型Data_Errorのである:

const Data_Error &other_cast = dynamic_cast<const Data_Error &>(other); 
+2

これらの目的のために、動的キャストがより適しています。 – LmTinyToon

+0

最初に追加しましたが、参照の動作が不明でした。しかし、あなたは正しいです、私はそれを読み取った – wasthishelpful

+0

'dynamic_cast'ソリューションは良いですか?もしそうなら、キャストに失敗したらどうしますか?それは例外を投げるか 'nullptr'に' other_cast'をセットしますか? – frarugi87

1

正しい方法はあるため、それは単に、ポインタにdynamic_castを使用することですオブジェクトが正しい派生型でない場合はnullを返します。あなたの例は、次のようになります:

bool Data_Error::operator==(const Data_Base &other) const 
{ 
    if (Data_Base::operator !=(other)) 
     return false; 

    const Data_Error *other_cast = dynamic_cast<const Data_Error *>(&other); 
    if (other_cast == nullptr) { // not the correct type 
     return false; 
    } 

    ... More tests on *other_cast ... 
} 
+0

これは他の "constness"に影響を及ぼしますか? – frarugi87

+0

なぜこれにdynamic_castを使用しますか?あなたが既にタイプを知っているなら、あなたはそれをstatic_castできます。 "キャスト時に、他の変数がData_Error以外のものである可能性はありません" – xaxxon

+0

@ frarugi87:いいえ、これはconstへのポインタへのconst refの変換です。 * constness *はここに保存されています。 –

関連する問題