2012-09-23 4 views
7

Ich bin C++ 11-ing einige Code. Ich habeVerwenden Sie unique_ptr für Besitzer und rohen Zeiger sonst?

class X { /* */ }; 

class A { 
    std::vector<X*> va_x; 
}; 

class B { 
    std::vector<X*> vb_x; 
    std::vector<A> vb_a; 
}; 

Der X * s von „va_x“ in meiner Klasse A Punkt auf Objekte, die zu

durch den X * s von „vb_x“ in meiner Klasse B. auch darauf sind

Nun möchte ich mag intelligente Zeiger verwenden. Für mich scheint es klar, dass die Klasse B, das Eigentum an den Objekten hat durch die X * hingewiesen (insbesondere, weil meine A-Instanzen zu B gehören)

Also soll ich eine unique_ptr für X innen B verwenden:

class B { 
    std::vector<unique_ptr<X>> vb_x; 
    std::vector<A> vb_a; 
}; 

Meine Frage ist, was soll ich für Klasse A tun? Soll ich rohe Zeiger behalten? Dadurch in meinen Unit-Tests so, muß ich zugeben, dass es zu umständlich Dingen führt (imo) zum Beispiel (nicht über Verkapselung Sorge, das ist nicht der Punkt):

unique_ptr<X> x(new X()); 
A a; 
a.va_x.push_back(&(*x)); //awkward, but what else can I do? 

A.vb_a.push_back(a); //ok 
B.vb_x.push_back(move(x)); //ok 
+0

Für zukünftige Fragen über C++ 11, bitte markieren Sie sie auch mit C++. :) – Xeo

+1

Haben Sie nicht schon vorher eine nahezu identische Frage gestellt? – Puppy

+0

@DeadMG Nun, die vorherige ist auch über unique_ptr, aber das ist nicht das Gleiche, was ich denke –

Antwort

9

Sie können x.get() verwenden, was den internen Zeiger zurückgibt.

Abgesehen davon, ja, mit rohen Zeigern, um nicht besitzende Referenzen zu handhaben, ist der Weg zu gehen, siehe auch this question.

+0

Ok danke. Aber das ist nicht so viel besser, oder? Also sollte ich sowieso rohe Zeiger verwenden? –

+0

@ BérengerBerthoul: Es gibt * nichts * falsch mit rohen Zeigern, solange sie nichts besitzen. Wie der Name sagt, sollten sie nur auf Dinge zeigen und alles ist in Ordnung. – Xeo

+0

Raten Sie es dann gelöst. Ich bin sehr vorsichtig mit diesen neuen Funktionen, weil ich keinen echten Code mit ihnen gesehen habe. Und da ich hörte "Ersetzen Sie Ihre rohen Zeiger mit intelligenten" überall, fing ich an zu denken, dass rohe Zeiger nicht mehr benötigt werden (was nicht sehr klug ist, gebe ich zu ...) Danke –

Verwandte Themen