2016-04-24 1 views
1

Ich habe einen intelligenten Zeiger einer Basisklasse Objekt Slicing zu verhindern etwa so:Foto von shared_ptr in Fehler führt: „keine Instanz überladene Funktion“ zu wollen, wenn Vektorliste push_back

vector<shared_ptr<BaseClass>> vectorOfObjects; 

ich weitergeben möchte diese Aufgabe durch eine Funktion ein abgeleitetes Objekt zu der Vektorliste hinzu:

function(vector<shared_ptr<BaseClass>>& vectorOfObjects) {} 

In dieser Funktion habe ich ein neues abgeleitete Objekt erstellen, das ich auf die Liste hinzufügen mag:

DerivedClass derivedObject = DerivedClass(); 

vectorOfObjects.push_back(&derivedObject); 

ich einen Fehler unter dem Punkt der letzten Zeile bekommen

no instance of overloaded function std::vector<_Ty,_Ax>::pushback 
[with _Ty="std::tr1::shared_ptr<BaseClass>,_Ax=std::allocator<std: 
:tr1::shared_ptr<BaseClass>>]" matches the argument list 

Jede Hilfe bei allen würde geschätzt viel über die besagt, wie ich kann nicht die richtige Lösung zu finden scheinen, um einen Vektor passieren aus eines Zeigers von Objekten (erforderlich, um Objekt-Slicing zu verhindern) durch eine Funktion.

+3

Das ist nicht wie geteilte Zeiger arbeiten. Sie teilen sich das Eigentum an einem * dynamisch zugewiesenen * Objekt. –

+0

@KerrekSB Ich habe Online-Empfehlungen gesehen, um die Verwendung von rohen Zeigern aufgrund von finddlichem Speichermanagement zu vermeiden, und so war dies die Alternative als ein intelligenter Zeiger. –

+1

Das Problem mit C++ ist, dass es kein einfaches Rezeptbuch gibt, dem Sie blind folgen können. Es gibt viele gute Tools, aber Sie müssen immer noch verstehen, wozu sie dienen und wann. Höchstwahrscheinlich möchten Sie keine zusätzliche dynamische Zuweisung und keine gemeinsame Eigentümerschaft, aber es ist natürlich unmöglich, ohne Kontext zu sagen. –

Antwort

3

Verwenden

// DerivedClass derivedObject = DerivedClass(); <<< Not needed 
vectorOfObjects.push_back(std::make_shared<DerivedClass>()); 

eine Reihe von constructor declarations Es gibt die Umwandlung von einem std::shared_ptr<DerivedClass> zu std::shared_ptr<BaseClass> ermöglichen.


Wie aus Ihrem comment

If I need to make a separate declaration, as I also have a vector member in my BaseClass, how can I declare a derivedObject separately as I have attempted earlier?

Es ist nicht ganz klar für mich, was „wie ich in meinem Baseclass auch ein Vektor Mitglied habe“ damit zu tun hat, aber wenn man Sie darauf bestehen, kann tun:

DerivedClass derivedObject* = new DerivedClass(); 
// Do special stuff only available in DerivedClass 
derivedObject->specialFunc(); 
vectorOfObjects.push_back(std::shared_ptr<DerivedClass>(derivedObject)); 
+0

Was ist, wenn ich das überladene Konstruktorobjekt der abgeleiteten Klasse dem Vektor und nicht dem Standardkonstruktor hinzufügen möchte? Say, 'DerivedClass derivedObject = DerivedClass (x, y);' –

+0

@MoB [std :: make_shared] (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) erlaubt es, ein beliebiges Bit zu übergeben Anzahl der Konstruktorparameter. –

+0

Ahh natürlich, vielen Dank für die Hilfe! Es wird sehr geschätzt! –

Verwandte Themen