• <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)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            污污内射久久一区二区欧美日韩| 日韩一区二区三区视频久久| 色婷婷久久综合中文久久蜜桃av | 国产精品无码久久综合| 99久久精品无码一区二区毛片| 国产午夜精品久久久久九九电影 | 国内精品欧美久久精品| 亚洲国产成人久久一区WWW| 久久久久久亚洲Av无码精品专口| 好久久免费视频高清| 亚洲人AV永久一区二区三区久久| 久久A级毛片免费观看| 中文成人久久久久影院免费观看| 浪潮AV色综合久久天堂| 性高湖久久久久久久久AAAAA| 欧美va久久久噜噜噜久久| 久久婷婷人人澡人人| 久久最近最新中文字幕大全| 亚洲欧洲久久av| 久久久久97国产精华液好用吗| 狠狠综合久久综合88亚洲| 久久精品亚洲精品国产欧美| 国产精品美女久久久久| 狠狠色婷婷久久综合频道日韩| 久久精品99无色码中文字幕| 久久青青草原国产精品免费| 99精品久久精品一区二区| 久久久久女教师免费一区| 热久久国产精品| 久久久久免费精品国产| 国内精品久久久久伊人av| 日产精品久久久久久久| 综合人妻久久一区二区精品| 久久99热这里只频精品6| 亚洲日韩欧美一区久久久久我 | 久久精品国产精品亚洲精品| 久久婷婷五月综合色奶水99啪| 亚洲美日韩Av中文字幕无码久久久妻妇| 四虎国产精品免费久久5151| 久久精品嫩草影院| 国产成人精品久久亚洲高清不卡|