2

私は今日、この「問題」に出くわしました。

このクラスがあり、変換演算子が含まれています。何かのようなもの:

class myClass {
public:
    ...

    operator anotherClass*() { return anotherClassPtr; }

    ...
}

今、これはすべてうまくいきます..私がこのばかげた間違いを犯すまでは:

void yetAnotherClass::foo(myClass* _p_class) 
{
  ...

  anotherClass* lp_anotherClass = (anotherClass*)_p_class;

  ...
}

そして、_p_class の anotherClassPtr が 0 であると確信していたにもかかわらず、lp_AnotherClass ptr がゼロ以外に設定された理由を理解するのに長い時間がかかりました。

この間違いを防ぐために myClass に追加できたものはありますか? オブジェクトの ptr が別のものにキャストされるのを防ぐことは可能ですか?

4

1 に答える 1

6
anotherClass* lp_anotherClass = (anotherClass*)_p_class;

まず第一に、Cスタイルのキャストを使用しないでください。C++スタイルのキャストを使用します。コンパイラが問題をすぐに教えてくれるので、それはあなたの時間を節約したでしょう:

auto* lp_anotherClass = static_cast<anotherClass*>(_p_class); //ERROR

次に、explicit変換関数を使用することをお勧めします。

explicit operator anotherClass*() { return anotherClassPtr; }

暗黙explicitの変換から生じる微妙なバグを回避し、さらにコードの可読性を向上させるため、変換関数を提案する理由!

explicit変換機能はC++11の機能であることに注意してください。

于 2013-01-18T16:14:25.057 に答える