2012-04-17 14 views
0

私はリソースへの私の文字列を移動していると、運よく、私は便利なように文字列をインスタンス化するLPCTSTR演算子があります。今、私はメッセージボックス(と同様のタイプキャストをしたいなぜこのCString型キャストが必要ですか?

CString str((LPCSTR) IDS_MY_STRING); 

を)ので、それはそうと同様のリソースから文字列をロードします

MessageBox(hWnd, (LPCTSTR) IDS_MY_STRING ,"Error", MB_RETRYCANCEL); 

しかし、これはうまくいかず、コンパイルされますが、実行時にクラッシュします。ここで、次の作業を行います。

MessageBox(hWnd, (CString) (LPCTSTR) IDS_MY_STRING ,"Error", MB_RETRYCANCEL); 

私の質問は、私たちがこの仕事をするためにCStringのにLPCTSTRからさらに型キャストする必要がない理由はMessageBox()はとにかくので第二パラメータとしてLPCTSTRを取るということですか?

答えて

1

他にも型キャストなどの詳細が説明されていますMessageBoxとそれを使用します(または、他のLPCTSTRパラメータのため)、その後

#define _S(id) (CString(LPCTSTR(id))) 

と::

MessageBox(hWnd, _S(IDS_MY_STRING), _S(IDS_TITLE), MB_RETRYCANCEL); 

また、あなたのコードを簡素化するために、あなたは#defineに、このような便利なマクロをすることができ

1

MessageBoxにはリソースIDを使用したオーバーロードはありませんが、代わりにAfxMessageBoxを使用できます。

+0

右ですが、この場合は 'AfxMessageBox'を使用できません。 – zar

3

IDS_MY_STRINGは実際には文字列へのポインタではありません。これは整数です。 (文字列ポインタの場合は、最初にLPCTSTRキャストは必要ありません)CStringは、整数リソースIDからリソース文字列を読み込む方法を知っています。

MessageBoxではありません。それは実際の文字ポインタを必要とします。CStringは暗黙的に提供します。

3

実際の質問(または少なくとも回答の興味深い部分)は、2番目の失敗の方法と最初の動作の詳細についてはあまりありません。

LPCSTRをとるCStringのコンストラクタは、実際には文字列へのポインタか文字列リソースの識別子かを調べるために値を実際に調べるため、最初の動作が行われます。後者の場合、自動的に文字列リソースをロードし、同じ内容のCStringを作成します。 IOW、文字列識別子からCStringへの暗黙の変換を取得しました。

CStringは、LPCSTR/LPCSTR/LPCWSTRへの暗黙的な変換もサポートしています。

C++は、を1つだけ返します。ユーザー定義の暗黙的な変換は、式に必要な型に渡されるすべての型から取得します。この場合、文字列IDをLPCTSTRにするには、文字列IDからCStringまでの2つが必要で、もう1つはCStringからLPCTSTRになる必要があります。コンパイラはそれを自動的には行いません。

したがって、LPCTSTRに文字列IDから取得するには、明示的にLPCTSTRかかるCStringのコンストラクタを使用していますCStringに文字列IDから変換する必要があります。したがって、文字列IDをLPCTSTRに、それをCStringにキャストするとCStringが作成されます。コンパイラは自動的にCStringから(実際の) `LPCTSTR 'に変換します。

+0

あなたの最後のパラはちょっと混乱します。私は 'string ID'から' CString'への変換がまだ必要であると言いたいと思います。 CStringより暗黙のLPCTSTRへの変換があります。型キャスト '(CString)(LPCTSTR)'では、IDからCStringへの変換を1回行っています。 – zar

+0

2つの明示的なキャストの代わりに 'CString((LPCTSTR)IDS_MY_STRING)'を書く方が読みにくいですか? –

+0

@ChristianAmmer:はい、とにかくそうするでしょう。 –

関連する問題