fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <cstdlib>
  4. #include <ctime>
  5.  
  6. using namespace std;
  7.  
  8. struct IFoo {
  9. virtual void foo() const = 0;
  10. };
  11.  
  12. struct FooA : public IFoo {
  13. void foo() const {cout << "FooA::foo()\n";}
  14. };
  15.  
  16. struct FooB : public IFoo {
  17. void foo() const {cout << "FooB::foo()\n";}
  18. };
  19.  
  20. enum FOO_TYPE
  21. {
  22. FOO_A, FOO_B
  23. };
  24.  
  25. std::unique_ptr<IFoo> get_a_foo()
  26. {
  27. using ptr_type = std::unique_ptr<IFoo>;
  28.  
  29. switch (std::rand() % 2)
  30. {
  31. case FOO_A: return ptr_type(new FooA);
  32. case FOO_B: return ptr_type(new FooB);
  33.  
  34. // or, if your compiler supports the C++14 [i]make_unique[/i]:
  35. // case FOO_A: return make_unique<FooA>();
  36. // case FOO_B: return make_unique<FooB>();
  37. default: return nullptr;
  38. }
  39. }
  40.  
  41. int main(int argc, char **args)
  42. {
  43. std::srand(std::time(0));
  44.  
  45. for (unsigned i = 0; i < 10; ++i)
  46. {
  47. auto foo_thing = get_a_foo();
  48.  
  49. foo_thing->foo();
  50. std::cout << '\n';
  51. }
  52. }
Success #stdin #stdout 0s 3428KB
stdin
Standard input is empty
stdout
FooB::foo()

FooB::foo()

FooB::foo()

FooB::foo()

FooA::foo()

FooB::foo()

FooB::foo()

FooA::foo()

FooB::foo()

FooB::foo()