Указатель на элемент в контейнере указателя буста - PullRequest
4 голосов
/ 11 июня 2009

Я только начинаю использовать boost::ptr_vector. У меня есть ptr_vector pctr в качестве члена одного класса A и я хочу, чтобы другой класс B ссылался на элемент в pctr. При создании объекта класса B я хочу сохранить указатель в pctr.

Поскольку контейнеры указателей не разрешают доступ к указателю (но только к ссылкам), я должен взять адрес ссылки из pctr и затем сохранить его в объекте типа B. Но взяв адрес ссылки кажется не интуитивным Есть ли лучшая альтернатива?

Ответы [ 2 ]

2 голосов
/ 11 июня 2009

Как вы обнаружили, контейнеры с указателями наддува хорошо защищают свои указатели. Конечно, вы можете победить его, взяв адрес ссылок, которые он выдаст, но помните, что вы можете ослабить силу требования контейнера указателя на авторитетное владение, привязавшись к этим указателям (все зависит от остальной части вашего кода на самом деле).

Альтернативы могут показаться:

  • Пусть класс B содержит итераторы, ссылающиеся на интересующий элемент-указатель контейнера (разумеется, необходимо учитывать обычные правила аннулирования итераторов).

  • Так как A владеет указателями, и вы, кажется, хотите, чтобы B содержал какую-то не принадлежащую ему слабую ссылку на него, используйте вместо этого контейнер shared_ptr, а B использует weak_ptr. Даунсайд может по производительности.

0 голосов
/ 11 июня 2009

Я думаю, что использование адреса разыменованного итератора является правильным способом достижения того, что вы пытаетесь сделать.

iterator it = ...
T *ptr = &*it;

Однако это опасно, потому что вы можете получить висячие указатели, если объект A уничтожен перед объектами B. Вот почему функция release, которая позволяет вызывающей стороне получать адрес объекта, также удаляет указатель из контейнера.

Если вы можете поддержать накладные расходы, вы можете подумать об изменении boost::ptr_vector на вектор умных указателей, например, std::vector<boost::shared_ptr<T> >.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...