2011-01-28 13 views
0

私は、これは持っている:リファレンスとポインタ関数パラメータ

void f1(Obj*x){ 
if(x==0){return;} 
... 
} 

void f2(Obj&x){ 
... 
f1(&x); 
... 
} 

void f3(Obj*x){ 
... 
f2(*x); 
... 
delete x; 
} 

私はF3へのポインタを渡すことを好きではない、そして、その後にアドレスを取るために、参照としてそれを渡すためにそれに値をとりますそれをポインタとして渡します。

f2でもポインタを取る方が良いでしょうか?

+2

おそらく、他の人が参考になる方が良いでしょう。 'delete'ステートメントは悪いですが、それをラップする必要があります。 – GManNickG

+0

参照渡しはできませんか? –

+0

f2には、決してNULLを取るべきではないという契約があるので、参照はそこでうまくいきます。非constを取るようにオブジェクトを修正するかもしれません。 f1は、NULLを渡して大文字と小文字を処理します。 – CashCow

答えて

0

クラスのインターフェイスにシンプルなデザインを使用してください。特に、ポインタへの参照を優先します。

代替手段がない場合にのみポインタとしてパラメータを使用します。このような場合は、ポインタの所有者を正確に文書化してください(通常は発信者 - 、通常、あなたに渡されたポインタは削除しないでください)。

+1

ポインタの所有者は、ラップされたクラスです。:) – GManNickG

+0

@GManはい。私は、 "クラスインタフェースでのポインタの使用を避ける"というストレスを与えたいと思います。 –

0

通常のルールは、あなたが参照を取ることができるなら、あなたがすることです。しかし、あなたの例ではf3の場合、ポインタを削除するという事実は、関数がポインタを取った場合、誰も関数が参照を削除することを期待しないので、はるかに単純であることを示唆しています。

f2は、NULL以外の値を渡しますので、参照は良い考えです。おそらく、それ以上の情報なしでconst-correctであると考えられます。つまり、f2はObjを非constメソッドを呼び出すことによって修正します。

デザインがf1、f2、f3などの名前の良いものかどうかは分かりません。時々、名前はすべての違いを生むことができます。たとえば、f3の名前が "useAndDispose"またはそれに類するものである場合、関数の呼び出し元には、使用後にポインタが削除されることが明らかになります。

同様に、関数がユーザーがクリーンアップする必要があるリソースを返す場合は、通常、これを示す名前(getSomethingではなくcreateSomething)が適しています。

ダニエルはあなたに渡されたポインタを削除しないと言っています。しかし、決して "決して"。この機能は、具体的にはクリーンアップ機能であってもよく、ワークフロー状況であって何かが回されて廃棄されてもよい。

あなたのコードを見ている人は決してそれを期待しないので、あなたはあなたに渡された参照を削除してはいけません。

+0

+1、関数名とセマンティクスについて強調するのは良いことです。 (ええと、残念ながら、私はすでに今日の1日の投票限度に達しており、明日は+1になるだろう;-) ') – peoro

0

ポインタと参照の主な違いは、参照をNULLにすることができないことです。したがって、f2()のパラメータが必須の場合は、参照渡しする必要があります。

チェックアウトthis other questions

関連する問題