我第一次尝试使用 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)
更传统的方法是:
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++ 开发人员阅读也不会那么惊讶。它也不太容易出错:即使您的示例代码也会混淆1并2用于多人游戏模式,并且由于您使用原始整数来存储它,因此编译器没有任何抱怨。使用enum class它会更难犯这样的错误。