寻求建议如何使用函数初始化指针对象

时间:2019-04-24 16:44:39

标签: c++

这是我目前的代码:

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)

但是我没有太多运气。 如果有人提供一些意见,那就太好了。

1 个答案:

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