ich so etwas wie diese:C++: Referenzen und Fabriken
struct D {
virtual void operator() {...};
}
struct D1 : public D {
virtual void operator() {...};
}
struct D2 : public D {
virtual void operator() {...};
}
void foo(D &d) {...};
Und so ist dies in Ordnung, und steuern schön den Lebenszyklus meines D's:
foo(D());
foo(D1());
foo(D2());
Aber ich wähle meine D-Variante an mehreren Stellen, so möchte ich eine einfache Fabrik:
const D& make_D()
{
// BAD, returning reference to temporary
if(is_tuesday())
return D1();
return D2();
}
Statt einen Verweis auf eine temporäre zurückzukehren, konnte ich eine obje zurückkehren ct, aber dann schneide ich in die Basisklasse. Alternativ könnte ich einen Zeiger von meiner Fabrik zurückgeben, aber dann muss der Klient ihn löschen. Andere, kompliziertere Lösungen belasten den Client zusätzlich.
Gibt es eine Möglichkeit, etwas zu schreiben, wie
D& d = make_D();
foo(d);
(oder sogar foo(make_D())
)? Das Ziel besteht darin, die Komplexität in die verschiedenen D-Definitionen und in make_D()
einzubinden, so dass die Funktionen wie foo()
und diejenigen, die diese Funktionen aufrufen, sich nicht darum kümmern müssen.
Hinweis: 'foo (D())' wird nicht kompiliert (nicht unter einem Compiler konform. Selbst VS gibt eine Warnung über nicht standardmäßiges Verhalten aus), da ein temporäres nicht an eine nichtkonstante l-Wert Referenz gebunden werden kann . –