Указатель на вектор изображений

Я работаю с openFrameworks, чтобы попытаться создать указатель на вектор изображений, которые хранятся в классе. Я создаю своего рода редактор последовательности изображений. С одной стороны находится сетка изображений, а с другой — область просмотра. Пользователь может щелкнуть ячейку сетки, содержащую последовательность изображений, чтобы отобразить ее в области просмотра.

В моем заголовке GridElement у меня есть:

vector<ofImage> *getImages();

В моем файле cpp для GridElement у меня есть:

vector<ofImage> *GridElement::getImages(){
    return &images;
}

Это векторная функция для возврата ссылки на вектор изображений, называемых изображениями.

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

Я сделал это с помощью цикла for для загрузки всех 15 экземпляров объекта.

for(int i = 0; i < 15; i++){
    viewImages = grid[i].getImages();
    }

Это не показывает ошибок. Затем я по модулю просматриваю свои изображения, используя переменную currentFrame, которая является просто целым числом, которое ведет подсчет.

currentFrame = (currentFrame +1)%viewImages->size();

Когда я затем нарисую его в своей функции отображения

 viewImages[currentFrame].draw(504, 0);

Эта строка не работает, ошибка "Нет участников, вызывающих отрисовку"

Также пытался вызвать его как указатель, но я получаю сообщение об ошибке в Xcode, говорящее, что это не указатель.

viewImages[currentFrame]->draw(504, 0);

Любые предложения будут ценны!


person Elliot    schedule 04.12.2015    source источник


Ответы (2)


Ваш GridElement::getImages() возвращает указатель на std::vector<ofImage>. В этом случае оператор [] используется для доступа к адресу памяти, а НЕ тот, который предоставил std::vector.

Этот:

viewImages[currentFrame].draw(504, 0);

должно быть:

(*viewImages)[currentFrame].draw(504, 0);
person Dean Seo    schedule 04.12.2015
comment
Я попробовал строку (*viewImages)[currentFrame].draw(504, 0);, но это привело к ошибке компоновщика. clang: error: linker command failed with exit code 1 (use -v to see invocation) Не совсем уверен, почему. Сборка прошла успешно, затем произошел сбой из-за этой ошибки - person Elliot; 04.12.2015
comment
@Elliot Ошибка компоновщика больше не имеет отношения к вашему исходному вопросу. Кроме того, эта ошибка компоновщика кажется ошибкой, с которой вам действительно нужно было иметь дело. Вы должны внимательно посмотреть на то, как реализован OfImage::draw. (Или что-то еще, из-за чего компоновщик теряет связь.) - person Dean Seo; 04.12.2015

Хорошо, давайте начнем с более простого примера, представьте, что у вас есть массив int:

int* pArray = new int[5];

Что делает компилятор, когда вы пишете pArray[3]?

он делает следующее: *(pArray + (sizeof (int) * 3)), где возвращаемое значение является целым числом.

То же самое происходит, когда у вас есть std::vector<whatever>* pVector, и вы пытаетесь сделать pVector[index]. Он обрабатывает pVector как массив std::vector<whatever>, возвращая объект std::vector<whatever> в позиции, определенной index, и я почти уверен, что std::vector не имеет члена с именем draw (не говоря уже о том, что вы вызываете Undefined Behavior, используя этот указатель на такой вектор ).

Попробуйте изменить это:

viewImages[currentFrame].draw(504, 0);

к этому:

viewImages->operator[] (currentFrame).draw(504, 0);
person Algirdas Preidžius    schedule 04.12.2015
comment
ofImage в openFrameworks имеет вызов draw, но да, не вектор. Я попробовал строку viewImages->operator[] (currentFrame).draw(504, 0);, но это привело к ошибке компоновщика. clang: error: linker command failed with exit code 1 (use -v to see invocation) - person Elliot; 04.12.2015
comment
@ Эллиот, я не задавался вопросом, есть ли у ofImage метод draw или нет. И, следовательно, здесь это не имеет значения (поэтому я использовал тип whatever, так как до последних 4 строк описание проблемы было бы правильным для любого типа), поскольку вы не пытались вызвать draw на ofImage , а точнее, на std::vector. - person Algirdas Preidžius; 04.12.2015
comment
@Elliot И тем не менее, вы не опубликовали настоящую ошибку компоновщика. Кроме того, я протестировал свой пример на MSVC, и он отлично скомпилировался. После того, как вы упомянули об этом, я попробовал его на онлайн-компиляторе C++, и он также компилировался нормально. Итак, я не знаю, откуда возникла ваша проблема (какой-то несвязанный код?). - person Algirdas Preidžius; 04.12.2015
comment
Ошибка компоновщика связана с QuickTime. ld: warning: ignoring file /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks//QuickTime.framework/QuickTime.tbd, missing required architecture x86_64 in file /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks//QuickTime.framework/QuickTime.tbd - person Elliot; 04.12.2015
comment
Использование QTKit, который устарел в OSX 10.9. - person Elliot; 04.12.2015
comment
Не уверен, почему я получил бы эту ошибку в отношении того, что я делаю - person Elliot; 04.12.2015
comment
@Elliot Итак, это не связано с обоими ответами, которые были вам даны, и вообще является отдельной проблемой (а не тем, о чем ваш вопрос). - person Algirdas Preidžius; 04.12.2015