用于创建命名构造函数的宏

Tan*_*ova 0 c++

我第一次尝试使用 C++ 和宏。所以基本上在讲座中我知道编码值用于区分对象的不同模式(在这种情况下为 game_type),然后必须通过具有有意义的命名构造函数的构造函数创建这些对象。所以我创建了 createSinglePlayerGame() 并命名了构造函数。然后我尝试使用宏优化此代码。所以在 Game 类中,我定义了类似函数的宏构造函数 A ## 运算符,它在两个标识符上运行参数替换,然后连接结果(“令牌粘贴)。

你能看看我的代码并提出更好的方法吗,你是否也看到我的宏可能被错误使用的任何卫生问题,

 class Game
    {
    public:
    #define CONSTRUCTOR(name, a) static Game create_##name() { return Game(a);}

            CONSTRUCTOR(Single, 0)
            CONSTRUCTOR(Multiple, 2)


        // named constructors
        static Game createSinglePlayerGame() { return Game(0); }
        static Game createMultiPlayerGame() { return Game(1); }

    protected:
        Game(int game_type);
    };
    int main()
    {
        Game myGame = Game::createSinglePlayerGame();
        Game second = Game::create_Single();

    }
Run Code Online (Sandbox Code Playgroud)

Joh*_*nck 5

更传统的方法是:

enum class GameType {
    SinglePlayer,
    MultiPlayer,
};

class Game
{
public:
    explicit Game(GameType type);
};

int main()
{
    Game myGame(GameType::SinglePlayer);
}
Run Code Online (Sandbox Code Playgroud)

这更简单,其他 C++ 开发人员阅读也不会那么惊讶。它也不太容易出错:即使您的示例代码也会混淆12用于多人游戏模式,并且由于您使用原始整数来存储它,因此编译器没有任何抱怨。使用enum class它会更难犯这样的错误。