У меня есть вектор указателей на объекты, определенные как:
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
Я думаю, что я должен получить доступ к методу неправильно, но я не уверен, как это сделать. У кого-нибудь есть идеи?
Благодарю!
Когда вы выполняете q[0]
, вы не получаете доступ к первому элементу вектора, вы на самом деле разыгрываете указатель. q[0]
== *q
== вектор.
То, что вы хотите сделать, это вызвать [0]
на вектор, на который указывает q
. Для этого вам сначала нужно разыменовать q
:
(*q)[0]->getData()
Помимо исправления синтаксических ошибок для разыменования ненужного указателя на вектор
(*q)[0]->getData()
вам следует серьезно подумать об использовании интеллектуальных указателей, например
std::vector<std::unique_ptr<queuedImage>>
или
std::vector<std::unique_ptr<queuedImage>>
для хранения ссылок в векторах, а не для raw-указателей.
Какой тип интеллектуального указателя фактически используется, зависит от вашего варианта использования.
Это должно быть
(*q)[0]->getData();
Но почему вы ненужно создаете указатель на вектор, когда вы уже приняли вектор по ссылке.
q
кажутся опасной комбинацией. Что если переменная, которую вы передадите в конструктор, выйдет из области видимости до того, как объект будет уничтожен? Тогда ваш указательq
останется висеть.