ポインタ呼び出し関数内でのメンバ参照
Posted: 2005年7月19日(火) 22:39
ご無沙汰しております。
下記のようなコードで、Ctestクラスのlpfn関数ポインタで、同クラス内のPrintValue関数を呼び出しているのですが、PrintValue関数内でValueメンバ変数を呼び出すと正しい値が表示されません。
VarPtr関数で検証してみたところ、PrintValue関数内のthisポインタとPrintValue関数呼び出し前のthisポインタが違っていることからthisポインタが変わったのが原因のようですが、これは仕様なのでしょうか。クラス外から関数ポインタで呼び出すとメンバ変数にアクセスできないことは、以前ウィンドウプロシージャの件で投稿がありましたが、クラス内のみの処理でも同じなのでしょうか。なお、私が調べた限り、PrintValue関数内のthisポインタと呼び出し前のlpfn変数のポインタの値が等しいので、lpfnを一番最初に宣言してthisポインタと等しくすることで、正しい値が表示されるようです。(上記のコードは実験しただけです。素直にPrintValue関数を呼び出せばいいことですが。)
下記のようなコードで、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()
コード: 全て選択