enum可以做索引

enum可以做索引, 配上虚函数,或者函数指针,可以实现上层的统一封装和快速索引。

点击(此处)折叠或打开

  1. MoTbl.cpp
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. enum {
  5.     eA=0,
  6.     eB,
  7.     eC,
  8.     eD,
  9.     eMax
  10. };
  11. class Bs{
  12.     public:
  13.         virtual void say(){ printf("Bs\n"); }
  14. };
  15. class A: public Bs{
  16.     int aa[1];
  17.     public:
  18.     void say(){printf("A\n");}
  19.     void call(){printf("A::call\n");}
  20. };
  21. class B: public Bs{
  22.     int aa[3];
  23.     public:
  24.     void say(){printf("B\n");}
  25.     void sing(){printf("B::sing\n");}
  26. };
  27. class C: public Bs{
  28.     int aa[10];
  29.     public:
  30.     void say(){printf("C\n");}
  31. };
  32. class D: public Bs{
  33.     int aa[100];
  34.     public:
  35.     void say(){printf("D\n");}
  36. };
  37. class MoTbl{
  38.     public:
  39.         union{
  40.             struct{
  41.                 A *a;
  42.                 B *b;
  43.                 C *c;
  44.                 D *d;
  45.             }t;
  46.             void *tv[eMax];
  47.         };
  48. };
  49.     int
  50. main ( int argc, char *argv[] )
  51. {
  52.     int i = 0;
  53.     MoTbl mt;
  54.     A a;
  55.     B b;
  56.     C c;
  57.     D d;
  58.     printf("A:%d\n",sizeof(MoTbl));
  59.     for(i=0; i<eMax; i++)
  60.         printf("%p\n",mt.tv[i]);
  61.     printf("--------------\n");
  62.     mt.tv[eA] = &a;
  63.     mt.tv[eB] = &b;
  64.     mt.tv[eC] = &c;
  65.     mt.tv[eD] = &d;
  66.     for(i=0; i<eMax; i++)
  67.         printf("%p\n",mt.tv[i]);
  68.     printf("--------------\n");
  69.     mt.t.a->say();
  70.     printf("--------------\n");
  71.     for(i=0; i<eMax; i++){
  72.         switch(i){enum 做索引 2012-10-11 18:17:14

    分类: C/C++

    enum可以做索引, 配上虚函数,或者函数指针,可以实现上层的统一封装和快速索引。

    点击(此处)折叠或打开

    1. MoTbl.cpp
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. enum {
    5.     eA=0,
    6.     eB,
    7.     eC,
    8.     eD,
    9.     eMax
    10. };
    11. class Bs{
    12.     public:
    13.         virtual void say(){ printf("Bs\n"); }
    14. };
    15. class A: public Bs{
    16.     int aa[1];
    17.     public:
    18.     void say(){printf("A\n");}
    19.     void call(){printf("A::call\n");}
    20. };
    21. class B: public Bs{
    22.     int aa[3];
    23.     public:
    24.     void say(){printf("B\n");}
    25.     void sing(){printf("B::sing\n");}
    26. };
    27. class C: public Bs{
    28.     int aa[10];
    29.     public:
    30.     void say(){printf("C\n");}
    31. };
    32. class D: public Bs{
    33.     int aa[100];
    34.     public:
    35.     void say(){printf("D\n");}
    36. };
    37. class MoTbl{
    38.     public:
    39.         union{
    40.             struct{
    41.                 A *a;
    42.                 B *b;
    43.                 C *c;
    44.                 D *d;
    45.             }t;
    46.             void *tv[eMax];
    47.         };
    48. };
    49.     int
    50. main ( int argc, char *argv[] )
    51. {
    52.     int i = 0;
    53.     MoTbl mt;
    54.     A a;
    55.     B b;
    56.     C c;
    57.     D d;
    58.     printf("A:%d\n",sizeof(MoTbl));
    59.     for(i=0; i<eMax; i++)
    60.         printf("%p\n",mt.tv[i]);
    61.     printf("--------------\n");
    62.     mt.tv[eA] = &a;
    63.     mt.tv[eB] = &b;
    64.     mt.tv[eC] = &c;
    65.     mt.tv[eD] = &d;
    66.     for(i=0; i<eMax; i++)
    67.         printf("%p\n",mt.tv[i]);
    68.     printf("--------------\n");
    69.     mt.t.a->say();
    70.     printf("--------------\n");
    71.     for(i=0; i<eMax; i++){
    72.         switch(i){
    73.             case eA: mt.t.a->say(); break;
    74.             case eB: mt.t.b->say(); break;
    75.             case eC: mt.t.c->say(); break;
    76.             case eD: mt.t.d->say(); break;
    77.         }
    78.     }
    79.     printf("--------------\n");
    80.     for(i=0; i<eMax; i++)
    81.         ((Bs *)mt.tv[i])->say();
    82.     printf("--------------\n");
    83.     for(i=0; i<eMax; i++){
    84.         switch(i){
    85.             case eA: mt.t.a->call(); break;
    86.             case eB: mt.t.b->sing(); break;
    87.         }
    88.     }
    89.     printf("--------------\n");
    90. }
    输出

    点击(此处)折叠或打开

    1. A:16
    2. 0xb7726ff4
    3. 0xb77238e4
    4. (nil)
    5. 0xb7615ff4
    6. --------------
    7. 0xbff0cd98
    8. 0xbff0cd88
    9. 0xbff0cd5c
    10. 0xbff0cbc8
    11. --------------
    12. A
    13. --------------
    14. A
    15. B
    16. C
    17. D
    18. --------------
    19. A
    20. B
    21. C
    22. D
    23. --------------
    24. A::call
    25. B::sing
    26. --------------

  73.             case eA: mt.t.a->say(); break;
  74.             case eB: mt.t.b->say(); break;
  75.             case eC: mt.t.c->say(); break;
  76.             case eD: mt.t.d->say(); break;
  77.         }
  78.     }
  79.     printf("--------------\n");
  80.     for(i=0; i<eMax; i++)
  81.         ((Bs *)mt.tv[i])->say();
  82.     printf("--------------\n");
  83.     for(i=0; i<eMax; i++){
  84.         switch(i){
  85.             case eA: mt.t.a->call(); break;
  86.             case eB: mt.t.b->sing(); break;
  87.         }
  88.     }
  89.     printf("--------------\n");
  90. }

输出

点击(此处)折叠或打开

  1. A:16
  2. 0xb7726ff4
  3. 0xb77238e4
  4. (nil)
  5. 0xb7615ff4
  6. --------------
  7. 0xbff0cd98
  8. 0xbff0cd88
  9. 0xbff0cd5c
  10. 0xbff0cbc8
  11. --------------
  12. A
  13. --------------
  14. A
  15. B
  16. C
  17. D
  18. --------------
  19. A
  20. B
  21. C
  22. D
  23. --------------
  24. A::call
  25. B::sing
  26. --------------