Доступ к методу класса, содержащемуся как вектор указателей на этот класс

0

У меня есть вектор указателей на объекты, определенные как:

 std::vector<queuedImage*> imgBuffer;

Я передаю его конструктору класса по ссылке:

processThread::processThread(std::vector<queuedImage*> &queueRef);

В классе processThread я определяю:

std::vector<queuedImage*> *q;

И внутри конструктора я делаю задание:

q = &queueRef;

Когда я нахожусь для доступа к элементам вектора, который уже заполнен объектами, размер вектора будет таким же ожидаемым при доступе как:

int qSize = q->size();

Это заставляет меня предположить, что это должно быть справедливым:

q[0]->getData()

Где getData является членом queuedImage.

Однако, когда я скомпилирую это, он, по-видимому, недействителен:

error: base operand of ‘-> has non-pointer type ‘std::vector<queuedImage*>

Но когда я использую. оператора:

q[0].getData()

Я получаю ошибку компиляции:

error: ‘class std::vector<queuedImage*> has no member named ‘getData

Я думаю, что я должен получить доступ к методу неправильно, но я не уверен, как это сделать. У кого-нибудь есть идеи?

Благодарю!

  • 0
    Этот конструктор и указатель q кажутся опасной комбинацией. Что если переменная, которую вы передадите в конструктор, выйдет из области видимости до того, как объект будет уничтожен? Тогда ваш указатель q останется висеть.
  • 0
    Это не должно быть проблемой здесь, так как вектор определен перед бесконечным циклом, который действует как конечный автомат - так что он никогда не выйдет из области видимости. Есть ли лучший способ передать вектор, чтобы обойти это? Конечно, единственное исправление - скопировать объект в конструктор, который будет очень медленным?
Теги:
class
vector

3 ответа

2
Лучший ответ

Когда вы выполняете q[0], вы не получаете доступ к первому элементу вектора, вы на самом деле разыгрываете указатель. q[0] == *q == вектор.

То, что вы хотите сделать, это вызвать [0] на вектор, на который указывает q. Для этого вам сначала нужно разыменовать q:

(*q)[0]->getData()
  • 0
    Да, это было, спасибо большое!
0

Помимо исправления синтаксических ошибок для разыменования ненужного указателя на вектор

 (*q)[0]->getData()

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

 std::vector<std::unique_ptr<queuedImage>>

или

 std::vector<std::unique_ptr<queuedImage>>

для хранения ссылок в векторах, а не для raw-указателей.

Какой тип интеллектуального указателя фактически используется, зависит от вашего варианта использования.

  • 0
    Есть ли причина делать это, кроме как сборка мусора? Я думал, что векторы справятся с этим?
  • 0
    @ user2290362 Нет, векторы не обрабатывают сборку мусора . Если это ваш реальный подход, ваш код непременно утечет память.
0

Это должно быть

(*q)[0]->getData();

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

  • 0
    Доступ к указателю осуществляется в другом методе класса, а не в конструкторе. Он просто «инициализируется» в конструкторе. Это то, что вы имели ввиду?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню