ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 17:13

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - ポインタ呼び出し関数内でのメンバ参照
作成者 メッセージ
  記事の件名:  Re: ポインタ呼び出し関数内でのメンバ参照  引用付きで返信する
メンバ関数の実装ではThisを引数として渡しています。
なのでPrintValueは実質*Sub(ByRef t As CTest)相当です。
lpfnの位置を変えたら動いたと言うのも偶然ではないかと思います。

#C++にはメンバへのポインタやbindなどがありますけど。
投稿記事 Posted: 2005年7月19日(火) 22:53
  記事の件名:  ポインタ呼び出し関数内でのメンバ参照  引用付きで返信する
 ご無沙汰しております。
 下記のようなコードで、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関数を呼び出せばいいことですが。)
引用:
引用:
コード:
投稿記事 Posted: 2005年7月19日(火) 22:39

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean