fork download
  1. #include <memory>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. #include <random>
  6. class Animal {
  7. public:
  8. virtual const char* Cry() {
  9. return "VOID.";
  10. }
  11. virtual const char* Name() {
  12. return "Animal";
  13. }
  14. typedef std::shared_ptr<Animal> AnimalHolder;
  15. };
  16.  
  17. class Human :public Animal {
  18. const char* Cry() {
  19. return "バルス!!!";
  20. }
  21. const char* Name() {
  22. return "パズー";
  23. }
  24. };
  25.  
  26. class Dog :public Animal {
  27. const char* Cry() {
  28. return "ワン!";
  29. }
  30. const char* Name() {
  31. return "犬";
  32. }
  33. };
  34. class Cat :public Animal {
  35. const char* Cry() {
  36. return "ニャー(チャオチュールクレ!!)";
  37. }
  38. const char* Name() {
  39. return "ぬこ";
  40. }
  41. };
  42.  
  43.  
  44. Animal::AnimalHolder AnimalFactory(std::size_t X) {
  45. switch (X) {
  46. case 0:
  47. return std::make_shared<Human>();
  48. case 1:
  49. return std::make_shared<Dog>();
  50. case 2:
  51. return std::make_shared<Cat>();
  52. }
  53.  
  54. return Animal::AnimalHolder();
  55. }
  56.  
  57. int main() {
  58.  
  59. int N = 2;
  60. std::minstd_rand mr;
  61. std::uniform_int_distribution<> ui(0, N);
  62. std::vector<Animal::AnimalHolder> v;
  63.  
  64. for (std::size_t i = 0; i < 16; i++) {
  65. v.push_back(AnimalFactory(ui(mr)));
  66. }
  67.  
  68. for (auto& o : v) {
  69. std::cout << o->Name() << " is Cry! "<< o->Cry() << std::endl;
  70. }
  71.  
  72.  
  73. return 0;
  74.  
  75. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
パズー is Cry! バルス!!!
パズー is Cry! バルス!!!
犬 is Cry! ワン!
ぬこ is Cry! ニャー(チャオチュールクレ!!)
ぬこ is Cry! ニャー(チャオチュールクレ!!)
パズー is Cry! バルス!!!
犬 is Cry! ワン!
犬 is Cry! ワン!
パズー is Cry! バルス!!!
ぬこ is Cry! ニャー(チャオチュールクレ!!)
パズー is Cry! バルス!!!
犬 is Cry! ワン!
犬 is Cry! ワン!
ぬこ is Cry! ニャー(チャオチュールクレ!!)
犬 is Cry! ワン!
犬 is Cry! ワン!