伊莉討論區

標題: [已解決-4樓大神]這應該算是涵式指標問題吧 [打印本頁]

作者: baepi    時間: 2021-6-10 12:06 PM     標題: [已解決-4樓大神]這應該算是涵式指標問題吧

本帖最後由 baepi 於 2021-6-13 02:39 PM 編輯

小弟最近有個專案~需要用到如下功能...以下是範例,與小弟的問題
  1. class _class
  2. {
  3. public:
  4.         void(*Func_Name) (void) = NULL;
  5.         void aa()
  6.         {
  7.                 cout << "這是內部程式\n";
  8.         }
  9. };
  10. void bb()
  11. {
  12.         cout << "這是外部程式\n";
  13. }
  14. void main()
  15. {
  16.         _class cc;
  17.         cc.Func_Name = bb;
  18.         cc.Func_Name();
  19.         system("pause");
  20.         cc.Func_Name = cc.aa;//此處不合法
  21.         cc.Func_Name();
  22.         system("pause");
  23. }
複製代碼
如程式碼展示~當cc.Func_Name = bb;<<<指向非class與其它包裝類的程式碼時,這是可以正常運作的
但是當cc.Func_Name指向class內的涵式時,編譯器就不給過了(廢話)
我依稀記得是有辦法可以解決的~但是太少碰到此情況~現在已經不記得怎樣才可以指向類別類的涵式
請知道的大大們告知~在此先感謝了

作者: snowflying    時間: 2021-6-12 04:32 AM

  1. int main()
  2. {
  3.         _class cc;
  4.         //cc.Func_Name = bb;
  5.         //cc.Func_Name();
  6.         cc.Func_Name = &_class::aa;//此處不合法
  7.         (cc.*cc.Func_Name)();
  8. }
複製代碼
bb 和 aa 原則上只能二選一,不然就是得調整呼叫方式
因為成員函式編譯完實際上會塞一個 this 指標當第一個參數
所以 aa 和 bb 其實傳的參數個數不同

作者: baepi    時間: 2021-6-12 11:24 AM

snowflying 發表於 2021-6-12 04:32 AM
bb 和 aa 原則上只能二選一,不然就是得調整呼叫方式
因為成員函式編譯完實際上會塞一個 this 指標當第一個 ...

感謝有大神回應~~~
如大神所述~二者只能取其一~而我想要的~正是指向class內部的涵式
畢竟指向外部...於我這方案來說~壓根是不需要的~我只是為了說明~沒想到卻混淆我的主要問題了
所以~大大~如何用指標指向自己class內部的涵式呢?
小弟再進一步說明寫作的想法
有一個class A型態~裡面有一個涵式指標
然後再做一個class B型態~它繼承於A型態~然後再生成涵式1~涵式2~涵式3....很多不等
最後產生B型態一個物件~該物件用A的涵式指標~指向B裡面的涵式1~涵式2~涵式3
作者: snowflying    時間: 2021-6-13 01:09 AM

baepi 發表於 2021-6-12 11:24 AM
感謝有大神回應~~~
如大神所述~二者只能取其一~而我想要的~正是指向class內部的涵式
畢竟指向外部...於我 ...

抱歉,我忘記 class 裡面有修改,忘了附上,前一層樓那個是可以動的
如果要繼承,也是相同的方法
  1. #include <iostream>
  2. using namespace std;

  3. class A
  4. {
  5.     public:
  6.         void(A::*Func_Name) (void) = NULL;
  7.         void func_a()
  8.         {
  9.                 cout << "這是內部程式 A\n";
  10.         }
  11.         void func_b()
  12.         {
  13.                 cout << "這是內部程式 B\n";
  14.         }
  15. };

  16. class B: public A{};

  17. int main()
  18. {
  19.         A a;
  20.         B b;
  21.         a.Func_Name = &A::func_a;
  22.         (a.*a.Func_Name)();
  23.         b.Func_Name = &A::func_a;
  24.         (b.*b.Func_Name)();
  25.         b.Func_Name = &A::func_b;
  26.         (b.*b.Func_Name)();
  27. }
複製代碼

作者: sst311212    時間: 2021-6-13 03:23 AM

baepi 發表於 2021-6-12 11:24 AM
感謝有大神回應~~~
如大神所述~二者只能取其一~而我想要的~正是指向class內部的涵式
畢竟指向外部...於我 ...

https://pastebin.com/a16Qp31A






歡迎光臨 伊莉討論區 (https://attach1201.eyny.com/) Powered by Discuz!