Передача элементов вектора в другую структуру данных по адресу

Я создаю 2D-игру и храню все свои вражеские объекты в массиве. Прямо сейчас я пытаюсь реализовать quadtree. В настоящее время я просто пытаюсь построить дерево квадрантов и не беспокоюсь о столкновениях. Код, который помещает элементы в дерево квадрантов, следующий:

for (std::vector<Enemy>::iterator i=m_enemies.begin(); i != m_enemies.end(); ++i) {
    std::cout << &(*i) << "Address of the object" << std::endl;
    m_quad.Insert(&(*i));
}

Код для вставки следующий:

void Quad::Insert(sf::RectangleShape* l_gameObject){
    std::cout << &l_gameObject << "dsa1" << std::endl;
    std::cout << "called insert " << m_objects.size() << std::endl;
    m_objects.push_back(l_gameObject);
    if (m_level < m_maxLevel) {
        if (m_objects.size() > 3) {
            std::cout<< "creating subregions " << m_objects.size() << std::endl;
            m_subRegions.push_back(Quad(m_x,m_y,m_width/2.f, m_height/2, m_level + 1, m_maxLevel-1));
            m_subRegions.push_back(Quad(m_x+m_width/2.f,m_y,m_width/2.f,m_height/2.f, m_level + 1, m_maxLevel-1));
            m_subRegions.push_back(Quad(m_x+m_width/2.f, m_y + m_height/2.f, m_width/2.f, m_height/2.f, m_level + 1, m_maxLevel-1));
            m_subRegions.push_back(Quad(m_x, m_y + m_height/2.f, m_width/2.f, m_height/2.f, m_level + 1, m_maxLevel-1));
            std::vector<int> temp;
            for (int i=0; i < m_objects.size(); i++){
                for (int j=0; j< m_subRegions.size(); j++) {
                    if (m_subRegions[j].Contains(m_objects[i])) {
                        m_subRegions[j].Insert(m_objects[i]);
                        temp.push_back(i);
                        break;
                    }
                }
            }
            for (int i = temp.size(); i > -1; i--){
                m_objects.erase(m_objects.begin() + temp[i]);
            }
        }
    }
}

Когда я печатаю адрес, который я передаю в функции вставки, и адрес, который у меня есть в функции, я вижу, что они разные. На самом деле on in всегда один и тот же, а тот, который я передаю, всегда отличается, как и должно быть. Кто-нибудь может пояснить, почему это так?

РЕДАКТИРОВАТЬ: Спасибо gsamaras за указание, что я печатал адрес параметра.

Дополнительный вопрос

Когда я использую методы объекта, к которому я обращаюсь, в первом цикле for я получаю правильные результаты, но когда я делаю то же самое в функции Insert, я получаю 0. Почему?


person Martin Spasov    schedule 30.11.2017    source источник
comment
Да, это было так. Я печатал адрес адреса. Не могли бы вы проверить редактирование второй проблемы, с которой я столкнулся?   -  person Martin Spasov    schedule 30.11.2017
comment
Что ж, я опубликовал ответ с более четким кодом, чем тот, который я прокомментировал ранее (поэтому я удалил этот комментарий), и это отвечает на ваш вопрос. Я не уверен, что вы имеете в виду с последующим вопросом. В общем, опубликованный вопрос должен задавать одну вещь.   -  person gsamaras    schedule 30.11.2017
comment
Это может не быть проблемой в вашем случае, но имейте в виду, что адреса std::vector элементов могут стать недействительными, если вы вставляете (или возвращаете) новые элементы (поскольку это может привести к перераспределению внутренний буфер).   -  person Scheff's Cat    schedule 30.11.2017
comment
Вы совершенно правы, но сейчас это не проблема. Сначала я хочу разобраться с нажатием, а затем реализовать очистку при удалении элемента.   -  person Martin Spasov    schedule 30.11.2017


Ответы (2)


Вы печатаете адрес адреса.

Измените это:

std::cout << &l_gameObject << "dsa1" << std::endl;

к этому:

std::cout << l_gameObject << "dsa1" << std::endl;

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

person gsamaras    schedule 30.11.2017

Внутри Insert вы печатаете адрес параметра.
Снаружи Insert вы печатаете значение параметра.

Вы хотите

std::cout << l_gameObject << "dsa1" << std::endl;

поскольку l_gameObject - это адрес, который вы передаете.

person molbdnilo    schedule 30.11.2017