Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1743580
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类:

2012-10-12 12:35:35

原文地址:enum 做索引 作者:wwwkljoel

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

阅读(292) | 评论(0) | 转发(0) |
0

上一篇:AWK初探

下一篇:读写锁详解

给主人留下些什么吧!~~