通过地址将向量的元素传递给不同的数据结构
Passing the elements of a vector to a different data structure by address
我正在构建一个 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]);
}
}
}
}
当我打印我传递给 到 Insert 函数的地址时,我在 in 函数中看到它们是不同的。事实上,on in 总是相同的,而我传递的总是不同的,因为它应该是这样的。谁能解释为什么会这样?
编辑:感谢 gsamaras 指出我正在打印参数的地址。
跟进问题
当我在第一个 for 循环中使用我正在寻址的对象的方法时,我得到了正确的结果,但是当我在 Insert 函数中做同样的事情时,我得到了 0。这是为什么?
在 Insert
中,您正在打印参数的地址。
在 Insert
之外,您正在打印参数的值。
你想要
std::cout << l_gameObject << "dsa1" << std::endl;
因为 l_gameObject
是您传入的地址。
您正在打印地址的地址。
改变这个:
std::cout << &l_gameObject << "dsa1" << std::endl;
对此:
std::cout << l_gameObject << "dsa1" << std::endl;
为了在你的函数之外打印同样的东西。
我正在构建一个 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]);
}
}
}
}
当我打印我传递给 到 Insert 函数的地址时,我在 in 函数中看到它们是不同的。事实上,on in 总是相同的,而我传递的总是不同的,因为它应该是这样的。谁能解释为什么会这样?
编辑:感谢 gsamaras 指出我正在打印参数的地址。
跟进问题
当我在第一个 for 循环中使用我正在寻址的对象的方法时,我得到了正确的结果,但是当我在 Insert 函数中做同样的事情时,我得到了 0。这是为什么?
在 Insert
中,您正在打印参数的地址。
在 Insert
之外,您正在打印参数的值。
你想要
std::cout << l_gameObject << "dsa1" << std::endl;
因为 l_gameObject
是您传入的地址。
您正在打印地址的地址。
改变这个:
std::cout << &l_gameObject << "dsa1" << std::endl;
对此:
std::cout << l_gameObject << "dsa1" << std::endl;
为了在你的函数之外打印同样的东西。