インスタンスから関数を呼び出すには、次の2つの方法の違いがありますか?どちらが良いですか?ポインタを使用するかどうか
Motor M;
M.moveToPosition(Speed, TargetPosition);
Motor *M;
M->moveToPosition(Speed, TargetPosition);
ありがとう!
インスタンスから関数を呼び出すには、次の2つの方法の違いがありますか?どちらが良いですか?ポインタを使用するかどうか
Motor M;
M.moveToPosition(Speed, TargetPosition);
Motor *M;
M->moveToPosition(Speed, TargetPosition);
ありがとう!
ポインタが初期化されていないため、2番目のバージョンはUndefined Behaviorです。
あなたは動的に(すなわち、ヒープ上にそれを割り当てる)タイプMotor
のオブジェクトを割り当てることができます。
Motor *M = new Motor;
M->moveToPosition(Speed, TargetPosition);
...
delete M;
Smart Pointersあなたはヒープに割り当てられたオブジェクトを削除することを忘れないように持って防ぐことができます。
どちらが優れているかは、文脈によって大きく左右されます。通常C++では、逆の明確な理由がない限り、自動オブジェクト(スタック上)を動的オブジェクト(ヒープ上)に置き換えることをお勧めします。
スマートポインタ(std :: unique_ptr)を介してMを指す方が良いでしょう。 –
@MarcinHoppe:あなたがコメントしている間、私はそのピース(そしてもっと)を追加していました:) –
最初のメソッドはMotor
コンストラクタを呼び出します。 2番目のメソッドは実行されず、ポインタは初期化されません。
C++では、可能な限りポインタから遠ざけてください。ここでは最初の方法を使用してください。
あなたが動的にモーターを割り当てたい場合は、この使用:
std::unique_ptr<Motor> M(new Motor);
M->moveToPosition(...);
もう一度試しましたか?初期化されていないポインタを参照解除するのはUBだから、問題なく実行すると驚くだろう。 –
何とかコンパイルします –
@Marwan Dessouki実際にはコンパイルされますが、期待どおりに実行されません。 –