zoukankan      html  css  js  c++  java
  • enum可以做索引

    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 "); }
    14. };
    15. class A: public Bs{
    16.     int aa[1];
    17.     public:
    18.     void say(){printf("A ");}
    19.     void call(){printf("A::call ");}
    20. };
    21. class B: public Bs{
    22.     int aa[3];
    23.     public:
    24.     void say(){printf("B ");}
    25.     void sing(){printf("B::sing ");}
    26. };
    27. class C: public Bs{
    28.     int aa[10];
    29.     public:
    30.     void say(){printf("C ");}
    31. };
    32. class D: public Bs{
    33.     int aa[100];
    34.     public:
    35.     void say(){printf("D ");}
    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 ",sizeof(MoTbl));
    59.     for(i=0; i<eMax; i++)
    60.         printf("%p ",mt.tv[i]);
    61.     printf("-------------- ");
    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 ",mt.tv[i]);
    68.     printf("-------------- ");
    69.     mt.t.a->say();
    70.     printf("-------------- ");
    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 "); }
      14. };
      15. class A: public Bs{
      16.     int aa[1];
      17.     public:
      18.     void say(){printf("A ");}
      19.     void call(){printf("A::call ");}
      20. };
      21. class B: public Bs{
      22.     int aa[3];
      23.     public:
      24.     void say(){printf("B ");}
      25.     void sing(){printf("B::sing ");}
      26. };
      27. class C: public Bs{
      28.     int aa[10];
      29.     public:
      30.     void say(){printf("C ");}
      31. };
      32. class D: public Bs{
      33.     int aa[100];
      34.     public:
      35.     void say(){printf("D ");}
      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 ",sizeof(MoTbl));
      59.     for(i=0; i<eMax; i++)
      60.         printf("%p ",mt.tv[i]);
      61.     printf("-------------- ");
      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 ",mt.tv[i]);
      68.     printf("-------------- ");
      69.     mt.t.a->say();
      70.     printf("-------------- ");
      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("-------------- ");
      80.     for(i=0; i<eMax; i++)
      81.         ((Bs *)mt.tv[i])->say();
      82.     printf("-------------- ");
      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("-------------- ");
      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("-------------- ");
    80.     for(i=0; i<eMax; i++)
    81.         ((Bs *)mt.tv[i])->say();
    82.     printf("-------------- ");
    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("-------------- ");
    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. --------------
  • 相关阅读:
    C#异步编程:多线程基础Thread类
    WPF:TextBox控件禁用中文输入
    C#:泛型的协变和逆变
    C#:泛型接口
    C#:泛型委托
    C#:泛型类
    Jetbrains Rider:缺少.NET Framework 4.5.2
    C#:泛型方法
    C#:泛型
    C#:接口
  • 原文地址:https://www.cnblogs.com/timssd/p/4781165.html
Copyright © 2011-2022 走看看