fork download
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3.  
  4. typedef struct Module Module_t;
  5. typedef struct{
  6. void (*Start)(Module_t*);
  7. void (*DoSomething)(Module_t*);
  8. void (*End)(Module_t*);
  9. void (*dtor)(Module_t*);
  10. } ModuleVTable;
  11.  
  12. typedef struct {
  13. ModuleVTable *vtable;
  14. } Module;
  15.  
  16. void Module_Start(Module* this){
  17. this->vtable->Start(this);
  18. }
  19.  
  20. void Module_DoSomeThing(Module* this){
  21. this->vtable->DoSomething(this);
  22. }
  23.  
  24. void Module_End(Module* this){
  25. this->vtable->End(this);
  26. }
  27.  
  28. void Delete_Module(Module* this){
  29. this->vtable->dtor(this);
  30. free(this);
  31. }
  32. typedef struct{
  33. Module base;
  34. } ModuleA;
  35.  
  36. typedef struct{
  37. Module base;
  38. } ModuleB;
  39.  
  40. static ModuleVTable ModuleA_vtable;
  41. static ModuleVTable ModuleB_vtable;
  42. void ModuleA_Start(ModuleA *this){
  43. printf("ModuleA.Start()\n");
  44. }
  45. void ModuleA_DoSomething(ModuleA *this){
  46. printf("ModuleA.DoSomething()\n");
  47. }
  48. void ModuleA_End(ModuleA *this){
  49. printf("ModuleA.End()\n");
  50. }
  51. void ModuleA_dtor(ModuleA *this){
  52.  
  53. }
  54. ModuleA *New_ModuleA(){
  55. ModuleA *rst =(ModuleA*)malloc(sizeof(ModuleA));
  56. rst->base.vtable = &ModuleA_vtable;
  57. return rst;
  58. }
  59. void ModuleB_Start(ModuleB *this){
  60. printf("ModuleB.Start()\n");
  61. }
  62. void ModuleB_DoSomething(ModuleB *this){
  63. printf("ModuleB.DoSomething()\n");
  64. }
  65. void ModuleB_End(ModuleB *this){
  66. printf("ModuleB.End()\n");
  67. }
  68. void ModuleB_dtor(ModuleA *this){
  69.  
  70. }
  71. ModuleB *New_ModuleB(){
  72. ModuleB *rst =(ModuleB*)malloc(sizeof(ModuleB));
  73. rst->base.vtable = &ModuleB_vtable;
  74. return rst;
  75. }
  76.  
  77. void ModuleA_Initialize(){
  78. ModuleA_vtable.Start = &ModuleA_Start;
  79. ModuleA_vtable.DoSomething = &ModuleA_DoSomething;
  80. ModuleA_vtable.End = &ModuleA_End;
  81. ModuleA_vtable.dtor = &ModuleA_dtor;
  82. }
  83. void ModuleB_Initialize(){
  84. ModuleB_vtable.Start = &ModuleB_Start;
  85. ModuleB_vtable.DoSomething = &ModuleB_DoSomething;
  86. ModuleB_vtable.End = &ModuleB_End;
  87. ModuleB_vtable.dtor = &ModuleB_dtor;
  88. }
  89. int main(){
  90. Module *m;
  91. ModuleA_Initialize();
  92. ModuleB_Initialize();
  93.  
  94. m = New_ModuleA();
  95. Module_Start(m);
  96. Module_DoSomeThing(m);
  97. Module_End(m);
  98. Delete_Module(m);
  99.  
  100. m = New_ModuleB();
  101. Module_Start(m);
  102. Module_DoSomeThing(m);
  103. Module_End(m);
  104. Delete_Module(m);
  105.  
  106. system("pause");
  107. return 0;
  108. }
Success #stdin #stdout #stderr 0s 1964KB
stdin
Standard input is empty
stdout
ModuleA.Start()
ModuleA.DoSomething()
ModuleA.End()
ModuleB.Start()
ModuleB.DoSomething()
ModuleB.End()
stderr
sh: pause: not found