2016-05-26 7 views
0

Wenn ich ein Setup wie folgt habe, was wäre ein geeigneter Smart-Pointer-Typ zu verwenden? Oder ist dies ein Fall, in dem stattdessen ein roher Zeiger verwendet werden sollte?Was ist der geeignete Smart-Zeiger, der verwendet wird, wenn ein Objekt an eine Funktion übergeben wird, die es erstellt

void factory (some_ptr_type_here<A> a) 
{ 
    a = some_type_of_new<A>(...,..); 
} 
some_ptr_type_here<A> a; 
factory(a); 
+1

Sie würden ein lächerlich opakes, indirekt indirektes Proxy-Objekt benötigen. Vielleicht 'std :: ref >' (und dann '* a.get() = ...') verwenden. Pfui. Müssen Sie wirklich das Argument nach Wert übergeben? –

+2

In einer höflichen Firma hätten Sie eine klarere API wie 'std :: unique_ptr factory();' und verwenden Sie sie dann als 'auto a = factory();'. –

+0

Aber wenn 'A' ein unvollständiger Typ ist, dann könnte ich es nicht als Rückgabetyp haben –

Antwort

4

Wenn ich wie unten ein Setup habe, was wäre ein geeigneter Smart-Pointer-Typ sein zu benutzen?

In diesem Fall könnte überhaupt kein intelligenter Zeiger diese Aufgabe übernehmen. Sie sollten Ihre Factory einfach einen neuen intelligenten Zeigertyp anstelle von void zurückgeben lassen. Bist du vielleicht ein C-Programmierer?

In jedem Fall hängt die Referenzzählung eines Smart-Pointers normalerweise vom Scoping (und/oder dem expliziten Erhöhen) ab. Das Übergeben eines intelligenten Zeigers an eine Funktion, die mit einem neuen Objekt gefüllt werden soll, unterbricht dieses Konzept. Ja, es ist möglich, Code zu schreiben, der so funktioniert, aber normalerweise behalten intelligente Zeiger (besonders unique_ptr und Cousins) interne Strukturen bei, die dies besonders schwierig machen.

Wirklich: Geben Sie einfach einen neuen intelligenten Zeiger zurück und zeigen Sie auf Ihr neues Objekt; Versuchen Sie nicht, nach Wert zu gehen. Sie würden sowieso nie einen Wert übergeben, wenn Ihre Funktion ein Objekt modifizieren würde, sondern durch Referenz. Dennoch ist die Rückgabe eines neuen intelligenten Zeigers das Richtige, wenn Sie eine Fabrik haben.

+0

Ich bin ein bisschen neu zu C++ 11 Stil der Codierung und so habe ich Schwierigkeiten, die Einschränkungen und Anwendungsfälle für die verschiedenen Smart-Zeigertypen außerhalb der üblichen prototypischen Beispiel zu begreifen les. –

+0

Fabriken, die intelligente Zeiger zurückgeben, ist kein C++ 11-Idiom. GNU Radio benutzt das seit - 2010, denke ich. Und GNU Radio war damit ein ziemlich konservatives Projekt. –

+0

Aber der Grund, warum ich es so machen muss, ist in meinem vollen Problem Ich muss die gesamte Fabrik (es ist eine Klasse) zu einem externen Code übergeben, der dann den Fabrikteil asynchron ausführt –