Ich habe eine abstrakte Basisklasse wie diese;Verwenden der Basisklasse anstelle des Basiszeigers, um an der abgeleiteten Klasse zu arbeiten
class X {
public:
virtual ~X(){}
virtual doSomething() = 0;
};
Dann bin der Umsetzung ich dies mit einigen Klassen wie Y, Z usw. von denen jede ihren eigenen Konstruktor, Destruktor und doSomething Implementierung. In meiner Hauptfunktion tue ich;
int main(){
std::vector<X *> v;
X *x1 = new Y();
X *x2 = new Z();
v.push_back(x1);
v.push_back(x2);
for(auto p : v){
p->doSomething()
}
}
Dies ruft die entsprechenden DoSomething-Implementierungen wie erwartet auf. Aber mein Problem ist, dass ich Zeiger auf abstrakte Klasse verwende, um eine Hierarchie von abgeleiteten Klassen durch seine Basisklasse zu manipulieren. Dies zwingt mich dazu, neue Instanzen auf dem Heap zu erstellen und diese anschließend manuell zu löschen. Gibt es eine Möglichkeit, so etwas zu tun?
int main(){
std::vector<X> v;
Y x1();
Z x2();
v.push_back(x1);
v.push_back(x2);
for(auto p : v){
p.doSomething()
}
}
So dass Destruktoren automatisch aufgerufen werden, wenn ich außer Haus bin. Ich weiß, dass ich kein Mitglied der abstrakten Klasse erstellen kann, aber das Verwenden von Zeigern, um das alles zu erreichen, erscheint seltsam. Sicherlich muss es einen Weg geben, dies ohne Zeiger und Neu-Löschen zu tun. Es wäre toll, wenn mir jemand die beste Praxis zeigen würde.
Ich bin neugierig, wenn Sie denken, dass 'push_back (make_unique())' ist besser als 'emplace_back (new Y)'. –
@JohnZwinck: Ja. –
Nun, ich denke, ich hätte das in meinen ersten Kommentar aufnehmen sollen, aber: warum? –