(C ++) Не могу заставить работать deque insert (), что я делаю не так? - PullRequest
0 голосов
/ 31 марта 2011

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

m_oGameObjectList является декой IGameObjects (базовый класс).
m_sPosition - это структура с 3-мя значениями (X, Y, Z).
gameObject является ссылкой на объект, полученный из IGameObject.

for (int i = 0; i < m_oGameObjectList.size(); i++)
{
    if (gameObject.m_sPosition.Z > m_oGameObjectList[i].m_sPosition.Z)
    {
        m_oGameObjectList.insert(i, gameObject);
        i = m_oGameObjectList.size();
    }
}

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

insert занимает iterator. Использование:

m_oGameObjectList.insert(m_oGameObjectList.begin() + i, gameObject);

Вам также нужно будет использовать указатели в вашем deque, сейчас вы нарезаете - вставляете копию IGameObject части gameObject

0 голосов
/ 31 марта 2011

Ваш вызов insert должен передать итератор (не целочисленный индекс) в очередь. Один из способов преобразования целочисленного индекса в итератор deque - через:

my_deque_iterator iter = m_oGameObjectList.begin();
std::advance(m_oGameObjectList, i);

... хотя есть несколько других решений, которые одинаково хорошо работают.

Вы также можете использовать функции deque, такие как push_back и push_front, которые просто берут объект, который вы хотите поместить в передней или задней части deque, соответственно.

0 голосов
/ 31 марта 2011

Попытка вставить объект, производный от IGameObject, в деку не будет работать, поскольку деку пытается сохранить копию объекта в ссылке, а не в самой ссылке.

В большинстве случаев, если вы пытаетесь сохранить класс hiearchy в контейнере, вы делаете это, имея контейнер указателей на базовый класс.

...