如何定义指针数组以及如何访问它?

问题描述 投票:0回答:2

我正在编写一款需要 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]的位置不一样,为什么会出现这种情况,我该怎么写才能使位置相同?

c++ arrays pointers
2个回答
1
投票

敌人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]访问对象时反映出来,因为它们都指向相同的内存位置。


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
    }
}

分配的内存会自动释放,没有悬空指针,安全无虞。

© www.soinside.com 2019 - 2024. All rights reserved.