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

问题描述 投票:3回答:1

这是我目前的代码:

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)

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

c++
1个回答
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
}
© www.soinside.com 2019 - 2024. All rights reserved.