这是我目前的代码:
Dice *p1Die, *p2Die;
if (p1DiceType == 1)
{
p1Die = new Dice(p1DieFaces);
p1Die->setDieType("normal");
}
else
{
p1Die = new LoadedDice(p1DieFaces);
p1Die->setDieType("loaded");
}
if (p2DiceType == 1)
{
p2Die = new Dice(p2DieFaces);
p1Die->setDieType("normal");
}
else
{
p2Die = new LoadedDice(p2DieFaces);
p2Die->setDieType("loaded");
}
我正在创建指针对象,并尝试根据骰子类型对其进行初始化。 1个,如果他们想要一个普通的骰子,2个,如果他们想要一个加载的骰子。我有我的代码工作。但是,我想提高可读性,并将if / else语句放在自己的函数中。
我不确定这是最好的方法。我考虑过将其放入构造函数中,但这似乎很笨拙。
我尝试编写各种功能,例如:
void Game::createDice(Dice **die, int dieType, int dieFaces)
但是我没有太多运气。 如果有人提供一些意见,那就太好了。
答案 0 :(得分:3)
我将至少对dieType使用枚举,也许dieFaces不知道那是什么。枚举通过为值赋予一个有意义的名称来使代码更具可读性。
enum class die_type { normal, loaded };
那么您的方法应该基本上是正确的,但是我将返回指针,而不返回值作为参数。
Dice* Game::createDice(die_type dieType, int dieFaces) {
Dice *die = nullptr;
switch(dieType) {
die_type::normal:
die = new Dice(dieFaces);
break;
....... }
return die;
不同的方法:现代C ++的一种更简单的方法是编写一个工厂函数,该函数也将影响生命周期:
std::unique_ptr<Dice> Game::createDice(DieType dieType, int dieFaces)
{
if (dieType == DieType::some_type)
return std::make_unique<Dice>(dieFaces);
if (dieType == DieType::some_other_type)
return std::make_unique<LoadedDice>(dieFaces);
// [...]
// throw here or return nullptr in case of unrecognized die type
}