Callback_32.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Callback_32.cpp : Diese Datei enthält die Funktion "main". Hier beginnt und endet die Ausführung des Programms.
  2. //
  3. #include <iostream>
  4. #include <ostream>
  5. #include <vector>
  6. #include <memory>
  7. // https://cplusplus.com/forum/articles/18756/
  8. #if 1
  9. class Weapon {
  10. public:
  11. int i = 10;
  12. };
  13. class Armor {
  14. public:
  15. int i = 11;
  16. };
  17. class Helmet {
  18. public:
  19. int i = 12;
  20. };
  21. class Scroll {
  22. public:
  23. int i = 13;
  24. };
  25. class Potion {
  26. public:
  27. int i = 14;
  28. };
  29. class Object {
  30. public:
  31. struct ObjectConcept {
  32. virtual ~ObjectConcept() {}
  33. virtual bool has_attack_concept() const = 0;
  34. virtual std::string name() const = 0;
  35. };
  36. template< typename T > struct ObjectModel : ObjectConcept {
  37. ObjectModel(const T& t) : object(t) {}
  38. virtual ~ObjectModel() {}
  39. private:
  40. T object;
  41. };
  42. std::shared_ptr<ObjectConcept> object;
  43. public:
  44. template< typename T > Object(const T& obj) :
  45. object(new ObjectModel<T>(obj)) {}
  46. std::string name() const
  47. {
  48. return object->name();
  49. }
  50. bool has_attack_concept() const
  51. {
  52. return object->has_attack_concept();
  53. }
  54. };
  55. int main() {
  56. std::vector< Object > backpack;
  57. backpack.push_back(Object(Weapon()));
  58. backpack.push_back(Object(Armor()));
  59. backpack.push_back(Object(Potion()));
  60. backpack.push_back(Object(Scroll()));
  61. for (auto &_btn : backpack)
  62. {
  63. std::cout << _btn.object << std::endl;
  64. }
  65. }
  66. #else
  67. struct Weapon {
  68. bool can_attack() const { return true; } // All weapons can do damage
  69. };
  70. struct Armor {
  71. bool can_attack() const { return false; } // Cannot attack with armor...
  72. };
  73. struct Helmet {
  74. bool can_attack() const { return false; } // Cannot attack with helmet...
  75. };
  76. struct Scroll {
  77. bool can_attack() const { return false; }
  78. };
  79. struct FireScroll {
  80. bool can_attack() const { return true; }
  81. };
  82. struct Potion {
  83. bool can_attack() const { return false; }
  84. };
  85. struct PoisonPotion {
  86. bool can_attack() const { return true; }
  87. };
  88. class Object {
  89. struct ObjectConcept {
  90. virtual ~ObjectConcept() {}
  91. virtual bool has_attack_concept() const = 0;
  92. virtual std::string name() const = 0;
  93. };
  94. template< typename T > struct ObjectModel : ObjectConcept {
  95. ObjectModel(const T& t) : object(t) {}
  96. virtual ~ObjectModel() {}
  97. virtual bool has_attack_concept() const
  98. {
  99. return object.can_attack();
  100. }
  101. /*
  102. virtual std::string name() const
  103. {
  104. return typeid(object).name;
  105. }
  106. */
  107. private:
  108. T object;
  109. };
  110. std::shared_ptr<ObjectConcept> object;
  111. public:
  112. template< typename T > Object(const T& obj) :
  113. object(new ObjectModel<T>(obj)) {}
  114. /*
  115. std::string name() const
  116. {
  117. return object->name();
  118. }
  119. */
  120. bool has_attack_concept() const
  121. {
  122. return object->has_attack_concept();
  123. }
  124. };
  125. int main() {
  126. typedef std::vector< Object > Backpack;
  127. typedef Backpack::const_iterator BackpackIter;
  128. Backpack backpack;
  129. backpack.push_back(Object(Weapon()));
  130. backpack.push_back(Object(Armor()));
  131. backpack.push_back(Object(Potion()));
  132. backpack.push_back(Object(Scroll()));
  133. backpack.push_back(Object(FireScroll()));
  134. std::cout << "Items I can attack with:" << std::endl;
  135. for (BackpackIter item = backpack.begin(); item != backpack.end(); ++item)
  136. if (item->has_attack_concept())
  137. std::cout << "name" << std::endl;
  138. }
  139. #endif