【初心者歓迎】C/C++室 Ver.42【環境依存OK】at TECH【初心者歓迎】C/C++室 Ver.42【環境依存OK】 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト13:デフォルトの名無しさん 07/09/03 23:05:49 C++3rd 15.5「メンバポインタ」の項を読むといい。 「メンバポインタは、変数ポインタや関数ポインタとは異なり、メモリの位置を指すポインタではない。 メンバポインタは、ポインタというよりも構造体オフセット、配列の添え字に近い。」 14:デフォルトの名無しさん 07/09/03 23:22:19 メンバ関数へのポインタは、 非仮想関数の場合アドレスを、 仮想関数の場合vtblのオフセットを保持するようになっている。 もちろんどっちを保持しているかのフラグも要るし、 多重継承などで複数のvtblがある場合も考えなければいけないし、 そうしてぶくぶくふくれていく。 15:デフォルトの名無しさん 07/09/03 23:22:59 14はもちろん例えばの話ね。 16:デフォルトの名無しさん 07/09/04 03:07:04 >>13のは、主にメンバ変数へのポインタの話。 >>9のは、独自拡張のいわゆる__closureの影響。 17:デフォルトの名無しさん 07/09/04 10:28:56 WinAPIの話なんですが、C/C++の型についてなので、ここで質問させてもらいます。 LPARAMの値lpを SetWindowLongPtr(wnd, DWLP_USER, lp); として設定すると、「LPARAMからLONGへの変換。データが失われる可能性がある」と出てきます。 LPARAMもLONGも、元をたどれば同じlongなので、データが変わることはないと思ったんですが… また、hoge *h; ていうクラスのポインタがあって、 h = reinterpret_cast<hoge *>(GetWindowLongPtr(wnd, DWLP_USER)); とすると、「LONGからより大きいサイズの hoge * へ変換します」と出てきます。 ↑2つとも、自分の環境だと自分の期待通り動いてるんですが、 64ビット環境とか、他の環境だと動かない可能性があると言うことでしょうか。 # そもそも、SetWindowLongPtrの第3引数や、GetWindowLongPtrの戻り値の型はLONG_PTRだと、 MSDNライブラリに書いてあるんですが、なぜLONGなのだろう… 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch