我正在编写一款需要 5 个敌人的游戏。我有一个类名“enemy”,这是我定义敌人指针的方法。
enemy* enemy1;
enemy* enemy2;
enemy* enemy3;
enemy* enemy4;
enemy* enemy5;
enemy1 = new enemy(enemypic[0], 100, 400, 494, 454,0.1,0.1, 10, attack[0], blood[0]);
以下是我如何构建敌人指针数组以及如何访问它们:
enemy* enemies[]={
enemy1,enemy2,enemy3,enemy4,enemy5
};
for (int i = 0; i < 5; i++) {
cout << i << endl;
cout << enemy1 << endl;
cout << enemies[i] << endl;
if (!enemies[i]) {
enemies[i] = new enemy(enemypic[i], 100, 400, 494, 454, 0.1, 0.1, 10, attack[0], blood[0]);
}
}
但是敌人1和敌人[0]的位置不一样,为什么会出现这种情况,我该怎么写才能使位置相同?
敌人1和敌人[0]的位置不一样,因为当你访问敌人[0]时,它是一个单独的指针,指向存储敌人1值的内存位置。尽管它们都是指向同一类型的指针,但它们是不同的变量。
如果你想让敌人[0]指向与敌人1相同的对象,你应该直接将敌人1分配给敌人[0]:
enemies[0] = enemy1;
这是代码的修改部分:
// Define pointers
enemy* enemy1;
enemy* enemy2;
enemy* enemy3;
enemy* enemy4;
enemy* enemy5;
// Assign initial values
enemy1 = new enemy(0, 100, 400, 494, 454, 0.1, 0.1, 10, 0, 0);
enemy2 = nullptr; // Initialize to nullptr
enemy3 = nullptr;
enemy4 = nullptr;
enemy5 = nullptr;
// Build the array of pointers
enemy* enemies[] = { enemy1, enemy2, enemy3, enemy4, enemy5 };
// Access and initialize if necessary
for (int i = 0; i < 5; i++) {
std::cout << i << std::endl;
std::cout << enemies[i] << std::endl;
if (!enemies[i]) {
enemies[i] = new enemy(i, 100, 400, 494, 454, 0.1, 0.1, 10, 0, 0);
}
}
// Now enemies[0] and enemy1 point to the same object
// Cleanup (don't forget to delete allocated memory)
for (int i = 0; i < 5; i++) {
delete enemies[i];
}
这样,通过敌人1对对象所做的更改也会在通过敌人[0]访问对象时反映出来,因为它们都指向相同的内存位置。
正如上面评论中已经说过的,不要在新程序中使用指针或
new
/delete
,太容易出错并且过时(旧式 - C 风格)编程。
改为使用 STL 容器,例如
class enemy {
public:
//needed for test in the iteration below
operator bool() const noexcept { return m_initialized; }
private:
bool m_initialized{false};
};
using enemy_list = std::vector<enemy>; //meaningful alias
enemy_list enemies{5}; //reserve 5 uninitialized enemies
for (enemy& e : enemies) { //iterate over all enemies in the list
if (!e) { //the bool operator is needed here
e = enemy(some, parameters); //construct a new enemy
}
}
分配的内存会自动释放,没有悬空指针,安全无虞。