• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            xyjzsh

            指向類成員對象的指針

            定義:
            class Shape
            {
            public:
            //...
            void moveTo(Point newLocation);
            bool validate()const;
            vritual bool draw() const=0;
            //...
            }:
            class Circle: public Shape
            {
            //...
            bool draw() const;
            //...
            };

            void (Shape::*mf1)(Point ) = &Shape::moveTo;//指向類的成員函數的指針。

            ReturnType (ClassName::*pFuncName)(paramList);
            pFuncName定義了指向ClassName中的一組函數。這組函數的形式是返回值為ReturnType,函數列表為paramList.

            ClassName的限定使得只有ClassName或派生自它的類的對象才能解引用這個函數指針。

              1 #include"stdafx.h"
              2 #include<stdio.h>
              3 #include<stdlib.h>
              4 
              5 class Base;
              6 class Derived;
              7 typedef long (Base::*PFunc)(long,long);
              8 
              9 enum FuncType
             10 {
             11     ADD=1,
             12     SUB,
             13     DIV,
             14     MUL,
             15 };
             16 
             17 typedef struct tagCallBackFunc
             18 {
             19     long funcType;
             20     PFunc proc;
             21 }COMMAND,*PCOMMAND;
             22 
             23 class Base
             24 {
             25 public:
             26 
             27     virtual PCOMMAND GetCommands(void);
             28     static COMMAND command[];
             29 
             30     long base_add(long a,long b){printf("in base_add()\n");return a+b;}
             31     long base_sub(long a,long b){printf("in base_sub()\n");return a-b;}
             32     long base_div(long a,long b){printf("in base_div()\n");return a/b;}
             33     long base_mul(long a,long b){printf("in base_mul()\n");return a*b;}
             34 };
             35 
             36 COMMAND Base::command[]={
             37                        {ADD,(PFunc)&Base::base_add},
             38                        {SUB,(PFunc)&Base::base_sub},
             39                        {MUL,(PFunc)&Base::base_mul},
             40                        {DIV,(PFunc)&Base::base_div},
             41                   };
             42 PCOMMAND Base::GetCommands()
             43 {
             44     return command;
             45 }
             46 
             47 class Derived:public Base
             48 {
             49 public:
             50     Derived(void){}
             51     ~Derived(void){}
             52     virtual PCOMMAND GetCommands(void){return command;}
             53 
             54     long add(long a,long b){printf("in add()\n");return a+b;}
             55     long sub(long a,long b){printf("in sub()\n");return a-b;}
             56     long div(long a,long b){printf("in div()\n");return a/b;}
             57     long mul(long a,long b){printf("in mul()\n");return a*b;}
             58 
             59     static COMMAND command[];
             60 };
             61 
             62 COMMAND Derived::command[]=
             63                    {
             64                        {ADD,(PFunc)&Derived::add},
             65                        {SUB,(PFunc)&Derived::sub},
             66                        {MUL,(PFunc)&Derived::mul},
             67                        {DIV,(PFunc)&Derived::div},
             68                        {0}
             69                     };    
             70 
             71 
             72 
             73 void  test(Base *control,FuncType funcType,long operand1,long operand2)
             74 {
             75     PCOMMAND pCommand = control->GetCommands();
             76     PCOMMAND pNowCommand=NULL;
             77 
             78     for(long i=0;pCommand[i].funcType;++i)
             79     {
             80         if(funcType == pCommand[i].funcType)
             81         {
             82             pNowCommand = &pCommand[i]; 
             83             break;
             84         }
             85     }
             86 
             87     if(pNowCommand)
             88     {
             89         long res = (control->*pNowCommand->proc)(operand1,operand2);
             90         printf("res=%d\n",res);
             91     }
             92 }
             93 
             94 int main()
             95 {
             96     Derived *=new Derived();
             97     Base *= (Base*)d;
             98     test(b,ADD,1,2);
             99 
            100     Base *bb = new Base;
            101     test(bb,MUL,1,2);
            102     delete bb;
            103     delete d;
            104     return 0;
            105 }

            第89行是對指向類成員函數的指針的解析。

            posted on 2010-12-15 14:00 呆人 閱讀(301) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構

            <2011年1月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導航

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久综合伊人77777| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久久WWW成人免费毛片| 久久久久免费视频| 久久精品国产亚洲AV蜜臀色欲| 97精品国产97久久久久久免费| 亚洲精品国产美女久久久| 国产亚洲欧美成人久久片 | 亚洲国产另类久久久精品黑人 | 免费久久人人爽人人爽av| 久久精品aⅴ无码中文字字幕重口| 99re久久精品国产首页2020| 久久99精品国产麻豆婷婷| 久久精品中文字幕一区| 国产精品免费久久久久影院| 99久久无色码中文字幕人妻| 国产福利电影一区二区三区久久老子无码午夜伦不 | 亚洲综合精品香蕉久久网| 狠狠综合久久综合中文88| 欧美亚洲国产精品久久| 国产免费福利体检区久久| 69SEX久久精品国产麻豆| 偷窥少妇久久久久久久久| 久久99久久无码毛片一区二区| 色狠狠久久AV五月综合| 久久精品视频一| 午夜福利91久久福利| 国内精品久久久久久久涩爱| 国产精品毛片久久久久久久| 伊人久久大香线蕉亚洲| 亚洲国产综合久久天堂| 精品国产乱码久久久久久浪潮| 久久成人影院精品777| 99久久超碰中文字幕伊人| 久久久无码精品亚洲日韩按摩| 狠狠色丁香久久婷婷综合蜜芽五月 | 97久久天天综合色天天综合色hd| 国产成人精品综合久久久久| 久久无码专区国产精品发布| 久久久亚洲裙底偷窥综合| 国产精品久久久香蕉|