因為 G 是內建函數(MOTIF 中的 XtAddCallback(Widget, void(*)(), ...);
^^^^^^^^^無法改變 :~~~
可否大略說說 5.4.5 ,因為我一直找不到 The C++ programming language 2nd
另有一問
宣告 static , 這樣一來不就和 C 的意義一樣了嗎 ?
還有, 不論在 private,protected,public中宣告的變數, 都不能被
宣告成 static 的 member functions 所共用,除非變成 全域變數.
但是如此一來就破壞 class 的美意了 :~~~
請問有解決之道嗎 ?
期待解答的 people
--
Some feeling never die ...
--
【 成大工程科學‧bbs.es.ncku.edu.tw 】● 使用者來自: 140.116.39.71 ●
(A::*method)() 和 (*func)() 是完全不一樣的東西, 怎麼可能這樣傳?
method(非 static) 使用要用 object->*method(),
而 func 則直接 call,
兩者用法跟本不同.
基本想法就錯了.
member function 互call 不用 object->*method()
如:
class A
{
void K(){ ... }
void H()
{
K(); /* 或 A::K(); */
}
};
我不是用
void main()
{
A a;
a.K(); /* 這才用 object->*method(); */
}
--
如果已經無法再行走,那麼就飛翔吧 ...
--
【 成大工程科學‧bbs.es.ncku.edu.tw 】● 使用者來自: 140.116.39.72 ●
>==> dy...@ms1.hinet.net ((四眼的王蟲)) 在文章中提到:
>: 將 void K() 宣告為 static 或者是
>: 將 G 宣告為 G(..., void (A::*)(), ...)
>因為 G 是內建函數(MOTIF 中的 XtAddCallback(Widget, void(*)(), ...);
> ^^^^^^^^^無法改變 :~~~
>
>可否大略說說 5.4.5 ,因為我一直找不到 The C++ programming language 2nd
>
>另有一問
> 宣告 static , 這樣一來不就和 C 的意義一樣了嗎 ?
> 還有, 不論在 private,protected,public中宣告的變數, 都不能被
> 宣告成 static 的 member functions 所共用,除非變成 全域變數.
> 但是如此一來就破壞 class 的美意了 :~~~
> 請問有解決之道嗎 ?
> 期待解答的 people
基本上 XtAddCallback 需要傳一個 function pointer, 並不適合傳
member function pointer, 最好想想別的作法, 假如一定要這樣做的
話, 也許可以這樣做:
class A
{
static A* s_pA;
static void Callback();
void K();
void H()
{
s_pA = this;
G(... , Callback , ...);
}
};
void A::Callback()
{
s_pA->K();
}
先決條件是 callback 函數被呼叫前 H() 不能又被呼叫,
否則前一次的 s_pA 值會被蓋過去, 當然你也得保證
callback 函數被呼叫時 s_pA 所指的 object 仍存在,
就看你的程式適不適用了.
四眼的王蟲
--
生命是在黑暗中閃爍的光
請刪掉不需要過長的引言.
: ==> EightCl...@csie.nctu.edu.tw ((嵐雲)) 在文章中提到:
: : (A::*method)() 和 (*func)() 是完全不一樣的東西, 怎麼可能這樣傳?
^^^^^^^^^^^^^^
: : method(非 static) 使用要用 object->*method(),
: : 而 func 則直接 call,
: : 兩者用法跟本不同.
: : 基本想法就錯了.
: member function 互call 不用 object->*method()
你好像沒看到我 method 是一個 type 為 (A::*)() 的 pointer?
幸好有你, 不然真不知道該怎麼辦 , 謝謝你
滿懷感激的people
--
Some feeling never die ...
我想我誤解你的意思了.
不過我再把我的問題說說...
我希望 將 void (A::*)() 的函數指標 代入
要 void(*)() 型態的函數指標參數的函數
for example:
void (A::*)()
|
\ /
function(.... ,void (*)() , ... );
但是因為多了 'A::' 所以要藉 static 來滿足 void(*)() 不過卻會
帶來一些後序問題 ... 感謝 dyliu 已幫我解決問題 :)
希望你能了解我的問題...
可不可以請你為你的觀點舉一些例子, 也許會有更好的問題出現 :)
期待進步的 people
: 我希望 將 void (A::*)() 的函數指標 代入
: 要 void(*)() 型態的函數指標參數的函數
: for example:
: void (A::*)()
: |
: \ /
: function(.... ,void (*)() , ... );
: 但是因為多了 'A::' 所以要藉 static 來滿足 void(*)() 不過卻會
: 帶來一些後序問題 ... 感謝 dyliu 已幫我解決問題 :)
四眼的王蟲過然厲害..
王蟲, 是不是風之谷啊? 動畫和漫畫我都很喜歡 :)
: 希望你能了解我的問題...
: 可不可以請你為你的觀點舉一些例子, 也許會有更好的問題出現 :)
我只是想強調說, 想傳一個非 static 的 member function pointer, 到一個
到一個 function pointer, 是不合理的.
事實上, 可以把一個 C++ 的 nonstaic member function, 對應到一
個 C 的 function, func(class *, param),
例如:
class C
{
void method();
other data member;
};
對應到 C
struct C
{
other member;
};
void method(struct C*);
也就是要用到 method, 同時也要傳一個 struct C 的 adreess.
就你的例子, 若硬是將 void (A::*)() 傳給 void (*)(),
想想看, 如何去使用 method?
就 method(); 這樣去用? 那 this 會是什麼?
並不只是差個 A:: 而已.
當然用 static 就不同了!
dyliu 的做法, 的確是我沒想到的.
我解釋的不會很好,
或許請 dyliu 解釋, 會比較容易了解點.
--
歡迎至 http://gais.cs.ccu.edu.tw/ 使用 GAIS 查詢台灣學術網路資源(BBS,WWW,FTP)
EightCloud(嵐雲)
>我只是想強調說, 想傳一個非 static 的 member function pointer, 到一個
> 到一個 function pointer, 是不合理的.
> 事實上, 可以把一個 C++ 的 nonstaic member function, 對應到一
> 個 C 的 function, func(class *, param),
>也就是要用到 method, 同時也要傳一個 struct C 的 adreess.
>
>就你的例子, 若硬是將 void (A::*)() 傳給 void (*)(),
> 想想看, 如何去使用 method?
> 就 method(); 這樣去用? 那 this 會是什麼?
> 並不只是差個 A:: 而已.
>
你說的沒錯, 基本上一個 class 的 non-static member function pointer
是不同於一個 free function 的 function pointer 的, 其差別在於要
呼叫 non-static member function pointer 時必須將它 bind 到一個
object 才行, 而 free function 的 function pointer 則否, 因此若把
non-static member function pointer 當成 free function 的 function
pointer 來呼叫的話, 根本就沒有 object 跟它 bind 在一起, 也就是
不知道 non-static member function pointer 裡的 this 到底是指甚麼,
因此 C++ 根本就不允許將 non-static member function pointer 轉成
free function 的 function pointer.
至於我提出的作法只是一個權宜之計, 是不得以下的辦法, 以
設計 class 的眼光來看, 為了傳 function pointer 而多出多餘的
static member function 並不是件好事, 況且如我前面所說尚有
許多限制, 我認為較好的作法是重新審視整個的設計避開這
種需要, 當然這樣做所花費的功夫較大, 假如覺得不值得的話
只好將就我的作法了.
四眼的王蟲
--
生命是在黑暗中閃爍的光
一般而言..我覺得這和callback函式的情況一樣
一個class的non-static member function pointer隱藏了this指標!
在轉換成一般的function pointer時,造成型別不對
所以compile時會有error!
就算通過了(雖然不可能),也可能造成stack overflow
而一般的staic member function則不含有this指標!
--
National Chiao-Tung University,Taiwan,ROC