値を返すために参照パラメータを使う必要がありますか?

api c++ winapi

HANDLEが出力パラメーターの場合、HANDLEへの参照を使用するのか、それとも直接HANDLEを使用するのが必要ですか?

bool fn(ハンドルh_result);

または

bool fn(ハンドル

  1  0


ベストアンサー

値を返すには、次の方法があります。

  1. パラメータとして参照を使う

  2. パラメータとしてポインタを使う

  3. 実際に値を返すには、 `+ return`を使用します

以下を指定した場合

bool fn(HANDLE h_result);

あなたはh_resultのコピーを作っています。 そのため、あなたがあなたの機能の中でそれを変えるならば、あなたはオリジナルではなくコピーを変えています。

ポインタを扱うとき、概念は全く同じです。 ポインタは単にメモリアドレスを保持する変数であることを忘れないでください。 そのメモリアドレスの内容は関係ありません。 パラメータを介してメモリアドレスを返したい場合は、ポインタへのポインタまたはポインタ参照を使う必要があります。

11


あなたのケースでは、私はむしろ何かのようにしたいと思います:

ハンドルfn()

失敗した場合は無効な(またはNULL)ハンドル、それ以外の場合は有効なハンドルを返します。 もちろん、HANDLE型はWin32 APIがハンドルとして使用しているものと多少似ていると思います。

質問に関しては、出力パラメータを参照またはポインタで渡してください。

bool fn(ハンドル

または

bool fn(ハンドル*アウト)

2番目の例では、渡されたポインタがNULLでないことを確認する必要があります。通常はアサートがあります。

bool fn(HANDLE * out){assert(NULL!= out); // ... コードの残り}

出力パラメーターをポインターとして渡すことのもう1つの欠点は、渡されたポインターが有効かどうか(初期化されているかどうか)がわからないことです。

参照渡しは、出力パラメータに関しては読みにくくなることがあります。 呼び出し

bool result = fn(myHandle);

myHandleが出力パラメータであることを開発者に示唆することはありませんし、コードの読みやすさのためにいくつかの微妙な問題が発生する可能性があります。

結論として、コードの読みやすさのため、できるだけ出力パラメータを避けることをお勧めしますが、実際に選択肢がない場合は、出力パラメータが必須の場合はポインタではなく参照を使用します。

1


HANDLEは基本的には無効*です、それがすべてです。 問題のコードをに変更します。

bool fn(void * pResult);

そして答えはより明確になります。 pResultに割り当てられた値をfnと呼ばれる人が誰でも利用できるようにしたい場合は、関数を次のように変更する必要があります。

bool fn(void *

これはと同等です

bool fn(ハンドル

1


“HANDLE”を直接使用した場合、関数呼び出し内で行った変更は呼び出し元のオブジェクトには伝達されません。

例えば “bool fn(HANDLE h_result);”の場合

ハンドルoH = CreateHandle(); //いくつかの関数oH.SetName( "Sam"); bool bRet = fn(oH); // oH.SetName( "Max");を呼び出すとします。 cout << oH.GetName()<< endl; // "Sam"を印刷します

しかし “bool fn(HANDLEを使うなら

したがって、選択はアプリケーションによって異なります。 “fn”で行われた状態の変更を維持する必要がある場合は、参照としてパラメータを渡します。 そうでない場合は、 “bool fn(HANDLE h_result);”を使用してコピーを渡します。

P.S “bool fn(HANDLE h_result)”はコピーコンストラクタへの呼び出しがたくさんあるので処理にかなり重いでしょう。

0


タイトルとURLをコピーしました