2017-03-15 33 views
1

私はHandle in Cの記事を読んでいたので、voidポインタとしてハンドルを実装していることに気付きました。 "何でも" Object/data型を取得しました。データとその価値を取得します。ハンドル、無効ポインタ、C++のオブジェクト

1.Ifは、我々は機能dosomething(21,2,2)に値を渡すと、それが21であるために値HANDLEポイントを意味しているのHandle in C

typedef void* HANDLE; 
int doSomething(HANDLE s, int a, int b) { 
     Something* something = reinterpret_cast<Something*>(s); 
     return something->doit(a, b); 
    } 

から取った次の例で言うことができます:だから私は基本的に2つの懸念を持っていますそうであれば、そのオブジェクトにそれをキャストするときどのようにオブジェクトをキャストするのですか?この例のように、それを使うことができるでしょうか?そうでない場合は、オブジェクトSomethingへのポインタは何かを返します。

2.Secondlyリンクも "あなたのコードでは、不透明な値 "実際にはどういう意味ですか?なぜ私たちは "ハンドルを渡す"のですか?誰かが偉大になるオブジェクトを使用するハンドルのより説得力のある例を与えることができる場合!

+0

これは、HANDLEの値が21_ Noであることを意味します。これは 's'が21であることを意味します。 – bejado

+0

私は間違っているかもしれませんが、コードでは、sを別の型にキャストします。実際の住所は決して変わりません – efekctive

答えて

2

1:ハンドルは、オブジェクトの識別子です。 "21"はオブジェクトではなく単に数値であるため、関数呼び出しは無効です。あなたのコードは、 's'が実際にタイプSomethingの構造体を指している場合にのみ機能します。簡単に言えば、ハンドルはメモリアドレス以外のポインタなので、 "21"はメモリアドレスとして解釈され、書き込みしようとするとプログラムがクラッシュする。

2: "Opaque valueあなたのコードを使用する開発者は、ハンドルが識別するオブジェクトの内部構造について何も仮定することはできません。これは、構造体へのポインタよりも優れています。開発者は構造体を見て、コードを変更した後にはもう真実ではないと思われるいくつかの前提を取ることができます。 「周りの渡し」単に意味:それを割り当てると同様に、関数呼び出しのパラメータとして、それを使用して:

HANDLE s = CreateAnObject(); 
DoSomethingWithObject(s); 
HANDLE t = s; 

などところで

:実際のコードでは、別の自分のオブジェクトへのハンドルを与える必要がありますEMPLOYEE_HANDLE、ORDER_HANDLEなどのような名前です。 ハンドルの典型的な例は、Windowsのウィンドウハンドルです。オペレーティングシステムの「ウィンドウ」メモリ構造がどのように構築されているかについての情報を提供せずに、ウィンドウを識別します。したがって、Microsoftはこの「内部構造」を変更することができました。

+0

よく説明しています。素晴らしい学習教材! –

1

我々は関数のdoSomething(21,2,2)に値を渡す場合は、その値ハンドル点を意味し21、

号であるためには、ちょうどvoid*の値を意味します21. Something型のオブジェクトへのポインタの値として21を扱うと、定義されていない動作につながる可能性が高くなります。

2.このコードでは、「あなたのコードでは、不透明な値としてハンドルを渡すだけです」というメッセージが実際にはどういう意味ですか?なぜ私たちは "ハンドルを渡す"のですか?誰かが偉大になるオブジェクトを使用するハンドルのより説得力のある例を与えることができる場合!

ハンドルは、あなたが何も見ることができないという意味では不透明です。ハンドルがvoid*で表されている場合は、void*を参照解除できないため、オブジェクトに関する情報は表示されません。ハンドルがint(コード内の他の場所で定義された配列のインデックスとして)で表される場合、ハンドルの値を見て、対応するオブジェクトが表すものを理解することはできません。

ハンドルを理解する唯一の方法は、ハンドル型に適したメソッドを使用してポインタまたは参照に変換することです。

ハンドルがvoid*である場合、投稿したコードは具体的なオブジェクトへのポインタを抽出してオブジェクトを理解する方法を示しています。

int doSomething(HANDLE s, int a, int b) { 

    // If the value of s is 3, something will be a reference 
    // to the fourth object in the array arrayOfSomethingObjects. 

    Something& something = arrayOfSomethingObjects[s]; 
    return something.doit(a, b); 
} 
+0

それは非常に意味をなさないですが、あなたはどんな行を精緻化してください?Something&something = arrayOfSomethingObjects [s];手段?オブジェクト型の配列でsが3の場合は、3で参照されているオブジェクトを参照し、何かに何かの型を割り当てますか? –

+0

@ GENIVI-LEARNER、私は少し答えを更新しました。 'Something&'を使うと、コピーではなく参照を作成しています。 –

1
私は1件の事実上のハンドル上の記事や実装するための事実上の方法があった実現しなかった

:ハンドルがintで表現されている場合には

、あなたはの線に沿って何かを見ることができますそれら。それらは通常、ウィンドウ構造であり、1985年のある開発者が実装することを決めた方法で実装できます。

それは本当に「ハンドル」と、確かにしようとしない独自のものを作成するのが習慣に取得しないでください

を「ブツ」と同じくらいの意味を持っている、というか、「リソースを取得するために使用することができブツ」 Voidポインタ、reinterpret_casts、およびHANDLEは、可能な限り、すべてのコストで避けるべきものです。

"ハンドル"に対処する必要がある唯一の時間は、Windows APIを使用する場合です。この場合、ドキュメントでは何をすべきか教えてくれます。

現代のC++では、オブジェクトを渡す場合は、参照、ポインタ、スマートポインタ(unique_ptr、shared_ptr、weak_ptrなど)を使用し、どのシナリオが必要かを調べます。

+0

thingyという言葉は、Handleという単語がちょっと混乱している原因を説明しています。 –

関連する問題