Chinaunix首页 | 论坛 | 博客
  • 博客访问: 544607
  • 博文数量: 104
  • 博客积分: 2089
  • 博客等级: 大尉
  • 技术积分: 1691
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-29 08:48
文章分类

全部博文(104)

文章存档

2015年(1)

2013年(13)

2012年(31)

2011年(59)

分类: C/C++

2012-10-11 18:17:14

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. --------------

阅读(1337) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~