Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

函式指標一問...

0 views
Skip to first unread message

嗯 ...

unread,
Nov 15, 1996, 3:00:00 AM11/15/96
to

==> dy...@ms1.hinet.net ((四眼的王蟲)) 在文章中提到:
: kevi...@bbs.es.ncku.edu.tw (嗯 ...) wrote:
: >請問C++ 同好
: >若
: >class A
: >{
: > ...
: > void K()
: > {
: > ...
: > }
: > void H()
: > {
: > ...
: > G(... , A::K , ...);
: > ...
: > }
: > ...
: >};
: >其中 G(... , void (*)() , ...)
: >當 compile 時會出現
: >ERROR:
: > Can not pass void(A::*)() to void(*)() ...
: >WHY ? WHY ? WHY ?
: 將 void K() 宣告為 static 或者是
: 將 G 宣告為 G(..., void (A::*)(), ...)
: 至於為什麼請你看看 Stroupstrup 的
: The C++ Programming Language 2nd
: 第 5.4.5 節
: 四眼的王蟲

因為 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 ●

嵐雲

unread,
Nov 15, 1996, 3:00:00 AM11/15/96
to

==> 在 kevi...@bbs.es.ncku.edu.tw (嗯 ...) 的文章中提到:
: ==> dy...@ms1.hinet.net ((四眼的王蟲)) 在文章中提到:
: : 將 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 的美意了 :~~~
: 請問有解決之道嗎 ?

(A::*method)() 和 (*func)() 是完全不一樣的東西, 怎麼可能這樣傳?
method(非 static) 使用要用 object->*method(),
而 func 則直接 call,
兩者用法跟本不同.
基本想法就錯了.

嗯 ...

unread,
Nov 15, 1996, 3:00:00 AM11/15/96
to

==> EightCl...@csie.nctu.edu.tw ((嵐雲)) 在文章中提到:
: ==> 在 kevi...@bbs.es.ncku.edu.tw (嗯 ...) 的文章中提到:

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 ●

四眼的王蟲

unread,
Nov 15, 1996, 3:00:00 AM11/15/96
to

kevi...@bbs.es.ncku.edu.tw (嗯 ...) wrote:

>==> 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 仍存在,
就看你的程式適不適用了.


四眼的王蟲
--
生命是在黑暗中閃爍的光

嵐雲

unread,
Nov 16, 1996, 3:00:00 AM11/16/96
to

==> 在 kevi...@bbs.es.ncku.edu.tw (嗯 ...) 的文章中提到:

請刪掉不需要過長的引言.

: ==> EightCl...@csie.nctu.edu.tw ((嵐雲)) 在文章中提到:
: : (A::*method)() 和 (*func)() 是完全不一樣的東西, 怎麼可能這樣傳?
^^^^^^^^^^^^^^
: : method(非 static) 使用要用 object->*method(),


: : 而 func 則直接 call,
: : 兩者用法跟本不同.
: : 基本想法就錯了.
: member function 互call 不用 object->*method()

你好像沒看到我 method 是一個 type 為 (A::*)() 的 pointer?


嗯 ...

unread,
Nov 16, 1996, 3:00:00 AM11/16/96
to

==> dy...@ms1.hinet.net ((四眼的王蟲)) 在文章中提到:

幸好有你, 不然真不知道該怎麼辦 , 謝謝你
滿懷感激的people
--

Some feeling never die ...

嗯 ...

unread,
Nov 16, 1996, 3:00:00 AM11/16/96
to

==> EightCl...@csie.nctu.edu.tw ((嵐雲)) 在文章中提到:
: ==> 在 kevi...@bbs.es.ncku.edu.tw (嗯 ...) 的文章中提到:

我想我誤解你的意思了.
不過我再把我的問題說說...
我希望 將 void (A::*)() 的函數指標 代入
要 void(*)() 型態的函數指標參數的函數
for example:
void (A::*)()
|
\ /
function(.... ,void (*)() , ... );

但是因為多了 'A::' 所以要藉 static 來滿足 void(*)() 不過卻會
帶來一些後序問題 ... 感謝 dyliu 已幫我解決問題 :)
希望你能了解我的問題...

可不可以請你為你的觀點舉一些例子, 也許會有更好的問題出現 :)

期待進步的 people

嵐雲

unread,
Nov 17, 1996, 3:00:00 AM11/17/96
to

嗯 ... (kevi...@bbs.es.ncku.edu.tw) 提到:

: ==> EightCl...@csie.nctu.edu.tw ((嵐雲)) 在文章中提到:
: : : : (A::*method)() 和 (*func)() 是完全不一樣的東西, 怎麼可能這樣傳?
: : : : method(非 static) 使用要用 object->*method(),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: : : : 而 func 則直接 call,
: : : : 兩者用法跟本不同.
: : : : 基本想法就錯了.

: 我希望 將 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(嵐雲)

嗯 ...

unread,
Nov 17, 1996, 3:00:00 AM11/17/96
to

==> EightCloud.bbs@firebird ((嵐雲)) 在文章中提到:
: 嗯 ... (kevi...@bbs.es.ncku.edu.tw) 提到:

謝謝

四眼的王蟲

unread,
Nov 18, 1996, 3:00:00 AM11/18/96
to

EightCloud.bbs@firebird (嵐雲) wrote:

>我只是想強調說, 想傳一個非 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 並不是件好事, 況且如我前面所說尚有
許多限制, 我認為較好的作法是重新審視整個的設計避開這
種需要, 當然這樣做所花費的功夫較大, 假如覺得不值得的話
只好將就我的作法了.

四眼的王蟲

--
生命是在黑暗中閃爍的光

James Peng

unread,
Nov 19, 1996, 3:00:00 AM11/19/96
to

四眼的王蟲 (dy...@ms1.hinet.net) wrote:
: 你說的沒錯, 基本上一個 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.

一般而言..我覺得這和callback函式的情況一樣
一個class的non-static member function pointer隱藏了this指標!
在轉換成一般的function pointer時,造成型別不對
所以compile時會有error!
就算通過了(雖然不可能),也可能造成stack overflow

而一般的staic member function則不含有this指標!


--
National Chiao-Tung University,Taiwan,ROC

0 new messages