[...]
-
[...]
-
std::vector<Obst*> obstSammlung; for(...) { Obst* oobject; switch(...) { case APFEL: { Apfel* aobject = new Apfel; aobject->methodeAusKlasseApfel(); oobject=aobject; } break; case BANANE: { Banane* bobject = new Banane; bobject->methodeAusKlasseBanane(); oobject=bobject; } break; } oobject->methodeAusKlasseObst(); obstSammlung.push_back(oobject); }
-
[...]
-
Vielleicht
std::vector<Obst*> obstSammlung; for(...) { Obst* oobject; switch(...) { case APFEL: { Apfel* aobject = new Apfel; aobject->methodeAusKlasseApfel(); oobject=aobject; } break; case BANANE: { Banane* bobject = new Banane; bobject->methodeAusKlasseBanane(); oobject=bobject; } break; default: oobject=0;//only to make the compiler happy assert(false); } oobject->methodeAusKlasseObst(); obstSammlung.push_back(oobject); }
-
[...]
-
#include <vector> #include <memory> #include <cstdlib> struct Base { void someBaseFoo(){} virtual ~Base(){} }; struct Derive1 : Base { void someDerive1Foo(){} }; struct Derive2 : Base { void someDerive2Foo(){} }; std::vector<std::unique_ptr<Base>> generate(int n) { std::vector<std::unique_ptr<Base>> obj; obj.reserve(n); for(int i = 0; i < n; i++) { std::unique_ptr<Base> ptr; if ( i%2 == 0 ) { std::unique_ptr<Derive1> ptr1(new Derive1()); ptr1->someDerive1Foo(); ptr = std::unique_ptr<Base>(ptr1.release()); } else { std::unique_ptr<Derive2> ptr2(new Derive2()); ptr2->someDerive2Foo(); ptr = std::unique_ptr<Base>(ptr2.release()); } ptr->someBaseFoo(); obj.push_back(std::move(ptr)); } return obj; } int main() { auto objs = generate(rand() % 10); return 0; }
(Schön finde ich den Code grad nicht oO, im Moment total java und C# gewöhnt, und meine Compiler hier sind alle noch nicht C++14 ready für z.B. std::make_unique)
-
So hätte ich den Teil 27-46 geschrieben:
for (int i = 0; i < n; i++) { auto ptr = [&]() -> std::unique_ptr<Base> { if (i % 2 == 0) { auto ptr1 = std::make_unique<Derive1>(); ptr1->someDerive1Foo(); return std::move(ptr1); } else { auto ptr2 = std::make_unique<Derive2>(); ptr2->someDerive2Foo(); return std::move(ptr2); } }(); ptr->someBaseFoo(); obj.push_back(std::move(ptr)); }
Wenn das zu modern ist,
ptr = std::unique_ptr<Base>(ptr1.release());
schreibt man besser als
ptr = std::move(ptr1);
.