std::shared_ptr der abstrakten Klasse abgeleitete Klasse instanziieren
Ich versuche, mit std::shared_ptr
, aber ich bin nicht sicher, ob ich benutzen kann shared_ptr
für eine abstrakte Klasse, und rufen Sie eine abgeleitete Klasse von dieser smart-pointer. Hier ist der code, den ich derzeit
IExecute *ppCIExecuteExecuteOperation = NULL;
for(int i = 0; i < 3; ++i)
{
switch (stOperationType.key)
{
case E_OPERATIONKEY::DrawCircle:
pCIExecuteExecuteOperation = new CCircle();
break;
case E_OPERATIONKEY::DrawSquare:
pCIExecuteExecuteOperation = new CSquare();
break;
case E_OPERATIONKEY::Rhombus:
pCIExecuteExecuteOperation = new CRehombus();
break;
default:
break;
}
}
pCIExecuteExecuteOperation->Draw();
Hier IExecute ist eine abstrakte Klasse und CCircle, CSquare, CRhombus ist eine abgeleitete Klasse von IExecute.
Alles was ich will zu tun ist, verwenden Sie shared_ptr<IEXectue>pCIExecuteExecuteOperation(nullptr)
und innerhalb einer switch-Anweisung machen Sie zu einer der abgeleiteten Klasse, Wie kann ich das erreichen?
Bearbeiten:
Die Antworten waren zu verwenden make_shared oder reset()
Danke Jungs, ich dint erwarten, dass es so einfach sein.
- Haben Sie tatsächlich versucht, es zu tun?
- Die offensichtliche Art und Weise funktionieren sollte.
- ich bin neu in c++ shared_ptr, lief über paar Seiten und war verwirrt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das einfach. Blick auf code und fühlen.
std::make_shared
stattnew
?new
in diesem Fall. Der Punkt, dass cppref Seite beziehen sich auf Reihenfolge der Auswertung, aber in meinem Fall nicht auftreten.reset()
. Gibt es einen Grund, lieberreset()
? Meiner Meinung nach ein Aufruf anmake_shared
oder den ctor vonshared_ptr
kombiniert mit der Zuweisungsoperator ist besser zu Lesen.make_shared
Ansatz, weil es verbessert die Lesbarkeit. Auch Nähte zu mir, dass es ist die am häufigsten verwendete Ansatz, trotz vielleicht dershared_ptr<T>(newT())
Ansatz kann zu einem Speicherverlust führen, wie in einem früheren post erwähnt. Ich habe tatsächlich einige Bücher und Artikel gelesen übershared_ptr
, aber es ist das erste mal, dass ich die Verwendung vonreset
für die Zuweisung einershared_ptr
. Wenn ich ehrlich bin, habe ich nicht neues vonreset
vor und sah ihn von oben bis.reset
denn es macht den code besser kürzer und einfach.Die Methode
std::make_shared<T>
erzeugt ein shared-pointer-Objekt vom TypT
auf und ruft deren Konstruktor. Also, anstatt zu telefonierennew
nennenstd::make_shared
.std::make_shared
ist auch in der Lage, verwenden Parameter, die an den Konstruktor übergeben wird, vorausgesetzt, es ist ein construcotr mit, dass die Parameter-Liste.Die Linie
sein sollte, ersetzen Sie mit
und dann jeweils die Zeilen mit den Zuweisungen geschrieben werden kann als
Dann können Sie anrufen
Draw