初始化具有非默认构造函数的std::数组项的更好方法

Better way to initialise std::array item that has non-default constructor?

本文关键字:数组 更好 方法 std 默认 构造函数 初始化      更新时间:2023-10-16

当前初始化basicEnemies数组时,我需要将audioManager传递给每个basicEnemy类的构造函数。然而,我有20个基本敌人,所以有没有更好的方法来初始化MainGameScene中的每个基本敌人,而不必像我现在这样重复audioManager传递给构造函数?需要调用每个basicEnemy的构造函数。

MainGameScene.h
MainGameScene(AudioManager *audioManager)
std::array<BasicEnemy, 20> basicEnemies;
MainGameScene.cpp
MainGameScene::MainGameScene(AudioManager *audioManager) : basicEnemies{audioManager, audioManager, audioManager, audioManager...}
{
}
BasicEnemy.h
BasicEnemy(AudioManager *audioManager)

如果问MainGameScene构造函数调用后的":"部分是什么并不过分,或者它被称为什么,这样我下次可以更准确地问?

如果您坚持使用std::array<BasicEnemy>数据成员,您可以使用额外级别的间接和std::index_sequence:

class MainGameScene {
private:
static constexpr std::size_t n_enemies = 20;
std::array<BasicEnemy, n_enemies> basicEnemies;
template<std::size_t... is>
MainGameScene(AudioManager* audioManager, std::index_sequence<is...>) :
basicEnemies{(is, audioManager)...}
{}
public:
MainGameScene(AudioManager* audioManager) : 
MainGameScene(audioManager, std::make_index_sequence<n_enemies>{})
{}
};

如果您可以放宽对数据成员类型以及std::shared_ptr(在堆上分配(的要求,那么另一个选项是std::optional(在自身内部存储对象(:

class MainGameScene {
private:
std::array<std::optional<BasicEnemy>, 20> basicEnemies;
public:
MainGameScene(AudioManager* audioManager) {
std::fill(basicEnemies.begin(), basicEnemies.end(), audioManager);
}
}; 

您可以生成它们:

MainGameScene::MainGameScene(AudioManager *audioManager) 
{
std::generate(basicEnemies.begin(), basicEnemies.end(), [&audioManager]() {
return BasicEnemy(audioManager);
}
}

为参数添加一个默认值,该值调用全局工厂函数:

BasicEnemy(AudioManager *audioManager = getAudioManager() )