2012-03-22 12 views
1

インスタンスから関数を呼び出すには、次の2つの方法の違いがありますか?どちらが良いですか?ポインタを使用するかどうか

Motor M; 
    M.moveToPosition(Speed, TargetPosition); 

    Motor *M; 
    M->moveToPosition(Speed, TargetPosition); 

ありがとう!

+5

もう一度試しましたか?初期化されていないポインタを参照解除するのはUBだから、問題なく実行すると驚くだろう。 –

+0

何とかコンパイルします –

+0

@Marwan Dessouki実際にはコンパイルされますが、期待どおりに実行されません。 –

答えて

4

ポインタが初期化されていないため、2番目のバージョンはUndefined Behaviorです。

あなたは動的に(すなわち、ヒープ上にそれを割り当てる)タイプMotorのオブジェクトを割り当てることができます。

Motor *M = new Motor; 
M->moveToPosition(Speed, TargetPosition); 
... 
delete M; 

Smart Pointersあなたはヒープに割り当てられたオブジェクトを削除することを忘れないように持って防ぐことができます。

どちらが優れているかは、文脈によって大きく左右されます。通常C++では、逆の明確な理由がない限り、自動オブジェクト(スタック上)を動的オブジェクト(ヒープ上)に置き換えることをお勧めします。

+2

スマートポインタ(std :: unique_ptr)を介してMを指す方が良いでしょう。 –

+0

@MarcinHoppe:あなたがコメントしている間、私はそのピース(そしてもっと)を追加していました:) –

2

最初のメソッドはMotorコンストラクタを呼び出します。 2番目のメソッドは実行されず、ポインタは初期化されません。

C++では、可能な限りポインタから遠ざけてください。ここでは最初の方法を使用してください。

あなたが動的にモーターを割り当てたい場合は、この使用:

std::unique_ptr<Motor> M(new Motor); 
M->moveToPosition(...); 
0

それは同じだが、ポインタを使用すると、あなたが動的に(ループ内でIE)オブジェクトを作成し、破壊することができると思いますが、上の操作を実行オブジェクトの任意の数、多形性を利用するなどです。

+0

...あなたが非常に慎重でないなら、本当にクールなメモリリークを取得してください! :) – hochl

+0

「偉大な力を持って...」 – Alexander

+0

「..大きなメモリリークが来る? ^^ – hochl

関連する問題