ab.com コミュニティ https://www.activebasic.com/forum/ |
|
ポインタ呼び出し関数内でのメンバ参照 https://www.activebasic.com/forum/viewtopic.php?t=213 |
ページ 1 / 1 |
作成者: | FALL [ 2005年7月19日(火) 22:39 ] |
記事の件名: | ポインタ呼び出し関数内でのメンバ参照 |
ご無沙汰しております。 下記のようなコードで、Ctestクラスのlpfn関数ポインタで、同クラス内のPrintValue関数を呼び出しているのですが、PrintValue関数内でValueメンバ変数を呼び出すと正しい値が表示されません。 コード: #N88BASIC TypeDef LPFN = *Sub() Class CTest Private 'lpfn As LPFN この位置で宣言すれば正しい値が表示される Value As Long lpfn As LPFN Sub PrintValue() Print GetDWord(VarPtr(this)) End Sub Public Sub CTest() Value = 365 lpfn = AddressOf(PrintValue) End Sub Sub CallPrintValue() lpfn() End Sub End Class Sub Main() Dim Test As CTest() Test.CallPrintValue() End Sub Main()VarPtr関数で検証してみたところ、PrintValue関数内のthisポインタとPrintValue関数呼び出し前のthisポインタが違っていることからthisポインタが変わったのが原因のようですが、これは仕様なのでしょうか。クラス外から関数ポインタで呼び出すとメンバ変数にアクセスできないことは、以前ウィンドウプロシージャの件で投稿がありましたが、クラス内のみの処理でも同じなのでしょうか。なお、私が調べた限り、PrintValue関数内のthisポインタと呼び出し前のlpfn変数のポインタの値が等しいので、lpfnを一番最初に宣言してthisポインタと等しくすることで、正しい値が表示されるようです。(上記のコードは実験しただけです。素直にPrintValue関数を呼び出せばいいことですが。) 引用: 引用: コード:
|
作成者: | イグトランス [ 2005年7月19日(火) 22:53 ] |
記事の件名: | Re: ポインタ呼び出し関数内でのメンバ参照 |
メンバ関数の実装ではThisを引数として渡しています。 なのでPrintValueは実質*Sub(ByRef t As CTest)相当です。 lpfnの位置を変えたら動いたと言うのも偶然ではないかと思います。 #C++にはメンバへのポインタやbindなどがありますけど。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |