2010-12-29 5 views
1
class Object { /* */ }; 

und ein paar abgeleitet:Abgeleitete Klassen und intelligente Zeiger

class Derived1 : public Object { /* */ }; 
class Derived2 : public Object { /* */ }; 

Und ich habe eine Funktion, die abgeleiteten Objekte macht und gibt Zeiger für Object;

Object *make() 
{ 
    return new Derived1(); 
} 

Also, auf diese Weise muss ich zurückgegebene Objekt von Smart-Zeiger, aber welchen Rückgabetyp zu verwenden?

TYPE? make() 
{ 
    return boost::shared_ptr<Derived1>(new Derived1()); 
} 

Antwort

6

können Sie:

boost::shared_ptr<Object> make() 
{ 
return boost::shared_ptr<Object>(new Derived1()); 
} 
+0

Ja, Sie sollten wahrscheinlich einen Zeiger auf die Basisklasse zurückgeben, nicht die abgeleitete Klasse. –

+0

@ John Dibling: Wenn Sie einen Zeiger auf die abgeleitete Klasse zurückgeben können, warum sollten Sie nicht? Was ist der Nachteil? Offensichtlich, wenn Sie nicht können, dann können Sie nicht. –

+0

@Charles: Offensichtlich weiß ich nicht genug über OPs Problem, um definitiv zu antworten. Ich hätte wahrscheinlich nicht einmal kommentieren sollen. Aber du hast Recht, wenn du es nicht kannst, dann kannst du nicht. Aber es ist meine allgemeine Erfahrung im Umgang mit polymorphen Instanziierungen von abstrakten Interfaces (von denen ich annehme, dass OP vielleicht falsch tut), dass "du nicht" öfter als "du kannst" wegen des Codes, der diese Zeiger verwendet, und so In diesen Fällen wird standardmäßig der Basiszeiger zurückgegeben. –

2

Die Antwort ist einfach:

boost::shared_ptr<Object> make() 
{ 
    return boost::shared_ptr<Derived1>(new Derived1()); 
} 

als Smart-Pointer bewahren den Zeiger Eigenschaft WRT Typumwandlung.

4

Logischerweise wäre die natürliche Transformation boost::shared_ptr<Object> sein, aber wenn die Funktion immer eine Derived1 kehrt dann wäre es besser, boost::shared_ptr<Derived1> so zurück, dass die Kunden den Vorteil der besseren statischen Typ Informationen nehmen können, wenn sie wollen.

Warum war es für die ursprüngliche Funktion notwendig, statische Informationen zu verwerfen?

+0

vielleicht ist es ein Werk ist, und es kann jede Art zurück. – bcsanches

+1

@bcsanches: Per Definition ist es eine Factory-Funktion, aber es gibt immer noch keinen Grund mehr statische Informationen wegzuwerfen, als unbedingt notwendig ist. –

+0

+1 Ich weiß, dass sowohl diese als auch die angenommene Antwort korrekt sind. Wer hat gesagt, dass Programmieren einfach ist? –