2016-07-28 2 views
0

Ich habe einen Vektor von Vektoren, wie diese machen: berechnenWie kann ich meine Shared_ptr Punkt auf die spezifische Adresse innerhalb einer verschachtelten Vektor

std::vector<std::vector<boost::shared_ptr<X> > > vOP; 

ich zuweisen möchten einen anderen boost::shared_ptr dem verschachtelten vector oben, und dann/bestimmte Visualisierungen anzeigen. Hier

ist der Ausschnitt aus meinem Code:

boost::shared_ptr<X> tempPtr; 

if(num < vOP[refID].size())  // refID returns the ID number 
{ 
    tempPtr = vOP[refID].at(num); 

    ROS_INFO_STREAM("ADDRESS OF vOP: "<< vOP[refID].at(num)<<" for refID: "<<refID); 
    ROS_INFO_STREAM("&REFERENCE ADDRESS OF vOP: "<< &vOP[refID].at(num)); 
} 

aber ich erhalte eine Geltendmachung Fehler fehlgeschlagen als tempPtr verweist nicht auf die verschachtelte vector.

Mein Code funktioniert, wenn refID 0 ist; aber sonst schlägt mein Code fehl. Sowohl die ROS_INFO_STREAM gibt verschiedene Adressen aus.

Kann mir jemand erklären, was diese beiden Adressen bedeuten? Wie mache ich meinen Zeiger auf die richtige Adresse?

+0

Sie sollten Ihre Frage so bearbeiten, dass sie das 'ros'-Tag enthält, was Ihre Chancen auf eine Antwort erhöht. –

+0

Nur ein Gedanke, 'num

+0

Danke Ihnen! Ich habe es jetzt hinzugefügt! – Greatgoing

Antwort

1

Sagen wir, Sie haben:

typedef boost::shared_ptr<X> VectorContent; 
typedef std::vector<VectorContent> 1D_Vector; 
typedef std::vector<1D_Vector> 2D_Vector; 

Dann:

vOP[refID].at(num) gibt ein VectorContent&

&vOP[refID].at(num) gibt ein VectorContent*

Wenn Sie drucken sie:

VectorContent& wird boost::shared_ptr<X>::get() aufrufen und den Zeiger drucken, den die boost::shared_ptr<X> hält.

VectorContent* wird die Adresse der boost::shared_ptr<X> selbst ausdrucken.

So erhalten Sie zwei verschiedene Adressen.

Wenn Sie die Adresse eines boost::shared_ptr<X> erhalten möchten, die innerhalb des vector ist, erklären tempPtr als boost::shared_ptr<X>& statt, so ist es ein Hinweis und keine Kopie.

+0

Danke für die Bearbeitung Remy :) –

0

Sie erhalten zwei verschiedene Adressen in der Ausgabe, weil Sie zwei verschiedene Zeiger zuerst an operator<< übergeben.

vOP[refID].at(num) gibt eine boost::shared_ptr<X>& - eine Referenz auf ein boost::shared_ptr<X>.

Boost definiert eine operator<<, die eine boost::shared_ptr an eine std::ostream ausgibt. Dieser Operator gibt den Zeiger aus, den der shared_ptr hält. Also, diese Zeile:

ROS_INFO_STREAM("ADDRESS OF vOP: "<< vOP[refID].at(num)<<" for refID: "<<refID); 

Ist das Gleiche wie folgt aus:

ROS_INFO_STREAM("ADDRESS OF vOP: "<< vOP[refID].at(num).get() <<" for refID: "<<refID); 

Wenn Sie die & Adreßoperator auf Referenz, es gibt die Adresse des Elements, auf das verwiesen wird.In diesem Fall gibt es die Adresse des boost::shared_ptr Objekts selbst zurück, nicht den Zeiger, den es hält.

Wenn Sie dies tun:

boost::shared_ptr<X> tempPtr = vOP[refID].at(num); 
ROS_INFO_STREAM("ADDRESS OF vOP: " << &tempPtr << " for refID: " << refID); 

tempPtr ist ein neues Objekt, das kopiert die X Zeiger. Sie geben die Adresse der -Variablen selbst aus, nicht die Adresse des boost::shared_ptr, die sich innerhalb des Vektors befindet.

Wenn Sie dies tun, statt:

boost::shared_ptr<X> &tempPtr = vOP[refID].at(num); 
ROS_INFO_STREAM("ADDRESS OF vOP: " << &tempPtr << " for refID: " << refID); 

tempPtr ist nun eine Referenz, keine Kopie. Sie geben die Adresse des boost::shared_ptr aus, die sich innerhalb des Vektors befindet.

Verwandte Themen