Als allgemeine Regel bevorzuge ich lieber Wert als Zeiger Semantik in C++ (dh mit vector<Class>
anstelle von vector<Class*>
). In der Regel wird der leichte Leistungsverlust mehr als wettgemacht, indem man nicht daran denken muss, dynamisch zugewiesene Objekte zu löschen.Kann ich in C++ polymorphe Container mit Wertesemantik haben?
Leider funktionieren Wertauflistungen nicht, wenn Sie eine Vielzahl von Objekttypen speichern möchten, die alle von einer gemeinsamen Basis abgeleitet sind. Siehe das Beispiel unten.
#include <iostream>
using namespace std;
class Parent
{
public:
Parent() : parent_mem(1) {}
virtual void write() { cout << "Parent: " << parent_mem << endl; }
int parent_mem;
};
class Child : public Parent
{
public:
Child() : child_mem(2) { parent_mem = 2; }
void write() { cout << "Child: " << parent_mem << ", " << child_mem << endl; }
int child_mem;
};
int main(int, char**)
{
// I can have a polymorphic container with pointer semantics
vector<Parent*> pointerVec;
pointerVec.push_back(new Parent());
pointerVec.push_back(new Child());
pointerVec[0]->write();
pointerVec[1]->write();
// Output:
//
// Parent: 1
// Child: 2, 2
// But I can't do it with value semantics
vector<Parent> valueVec;
valueVec.push_back(Parent());
valueVec.push_back(Child()); // gets turned into a Parent object :(
valueVec[0].write();
valueVec[1].write();
// Output:
//
// Parent: 1
// Parent: 2
}
Meine Frage ist: Kann ich meinen Kuchen (Wert Semantik) haben und es auch essen (polymorphe Container)? Oder muss ich Zeiger verwenden?
'boost :: ptr_vector' ist oft eine billigere und einfachere Alternative zu' std :: vector> ' –
ben
Diese Antwort bezieht sich nicht auf Wert Semantik. shared_ptr liefert Referenzsemantik über von T abgeleitete Klassen, für Instanz, shared_ptr a, b; b.reset (neu abgeleitet1); a = b; erstellt keine Kopie des Derived1-Objekts. –
Aaron
Ich habe nie gesagt, meine Lösung adressiert Wert Semantik. Ich sagte, es sei "eine vernünftige Lösung". Wenn Sie einen Weg kennen, um eine polymorphe Wertesemantik zu haben, dann steigen Sie direkt auf und sammeln Sie Ihren Nobelpreis. –