2016-07-28 5 views
0

У меня есть вектор векторов, например:Как мне сделать мою точку shared_ptr к определенному адресу внутри вложенного вектора

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

Я хочу, чтобы назначить другую boost::shared_ptr к вложенной vector выше, а затем вычислить/отображать определенные визуализации.

Вот фрагмент моего кода:

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)); 
} 

Но я получаю assertation удалось ошибку как tempPtr не указывает на этой вложенной vector.

Мой код работает, если refID = 0; но в противном случае мой код не сработает. Оба вывода ROS_INFO_STREAM выводят разные адреса.

Может кто-нибудь объяснить мне, что означают эти два адреса? Как сделать указатель на правильный адрес?

+0

Вы должны отредактировать свой вопрос, указав тег 'ros', тем самым увеличив ваши шансы получить ответ. –

+0

Просто мысль, 'num

+0

Спасибо! Я добавил его сейчас! – Greatgoing

ответ

1

Допустим, у вас есть:

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

Тогда:

vOP[refID].at(num) возвращает VectorContent&

&vOP[refID].at(num) возвращает VectorContent*

При печати их:

VectorContent& вызовет boost::shared_ptr<X>::get() и напечатает указатель, который удерживает boost::shared_ptr<X>.

VectorContent* напечатает адрес boost::shared_ptr<X>.

Таким образом, вы получаете два разных адреса.

Если вы хотите, чтобы получить адрес boost::shared_ptr<X>, который внутри vector, объявить tempPtr как boost::shared_ptr<X>& вместо этого, так это ссылка, а не копия.

+0

Спасибо за редактирование Remy :) –

0

Вы получаете два разных адреса на выходе, потому что вы начинаете с двух разных указателей до operator<<.

vOP[refID].at(num) возвращает boost::shared_ptr<X>& - в ссылку к boost::shared_ptr<X>.

Boost определяет operator<<, который выводит boost::shared_ptr на номер std::ostream. Этот оператор выводит указатель, который удерживает shared_ptr. Таким образом, эта линия:

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

фактически то же самое, как это:

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

При использовании оператора & адрес на ссылку, он возвращает адрес элемента, который ссылается.В этом случае он возвращает адрес самого объекта boost::shared_ptr, а не указателя, который он удерживает.

Если вы сделаете это:

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

tempPtr новый объект, который копирует X указатель. Вы будете вывести адрес самой переменной tempPtr, а не адрес boost::shared_ptr, который находится внутри вектора.

Если вы сделаете это вместо:

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

tempPtr теперь ссылка, а не копия. Вы будете вывести адрес boost::shared_ptr, который находится внутри вектора.