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.
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? –
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();'. –
Aber wenn 'A' ein unvollständiger Typ ist, dann könnte ich es nicht als Rückgabetyp haben –