这是我目前的代码:
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)
但我没有太多运气。如果有人有一些意见,那就太好了。
我会使用至少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
}