C++中如何以简洁方式向不同函数传递重复参数?
C++中避免重复传递游戏实体参数的方案
针对你遇到的多个函数需要重复传递大量游戏实体参数的问题,有几种简洁高效的解决方式:
1. 将所有游戏状态打包为一个结构体/类
把分散的GameData、各种实体容器、SpaceShip等统一封装到一个**游戏状态结构体(或类)**中,这样所有需要这些数据的函数只需要传递这个结构体的引用即可,彻底消除参数冗余。
代码示例:
首先定义游戏状态结构体:
struct GameState { int n; GameData gameData; vector<Bullet> bullets; vector<Dart> darts; vector<Striker> strikers; vector<Wraith> wraiths; vector<Banshee> banshees; SpaceShip spaceship; };
然后修改原来的函数:
// 保存游戏:传入const引用(仅读取状态,不修改) void gameSaver(const GameState& gameState); // 加载游戏:传入非const引用(需要修改状态) int gameLoader(GameState& gameState);
这种方式的优势:
- 函数签名简洁清晰,可读性大幅提升
- 后续新增游戏实体时,只需修改
GameState,无需逐一修改所有相关函数的参数列表 - 清晰划分游戏状态边界,逻辑更易维护
2. 将函数改为GameState类的成员函数
如果gameSaver、gameLoader这类函数本身就是负责操作游戏状态的,直接把它们定义为GameState类的成员函数更符合面向对象设计,无需传递任何参数就能直接访问类内成员变量。
代码示例:
class GameState { private: int n; GameData gameData; vector<Bullet> bullets; vector<Dart> darts; vector<Striker> strikers; vector<Wraith> wraiths; vector<Banshee> banshees; SpaceShip spaceship; public: // 保存游戏的成员函数(const修饰表示不修改类内状态) void save() const; // 加载游戏的成员函数,返回值表示加载结果 int load(); };
这种方式的优势:
- 完全消除参数传递冗余
- 封装性更好,游戏状态的访问可通过类接口严格控制
- 贴合C++面向对象的编程范式
3. 谨慎使用全局变量/单例模式
如果整个游戏只会存在一份游戏状态,可以考虑把GameState设为全局变量,或者用单例模式实现全局访问,但这种方式需谨慎使用:
- 优点:无需传递任何参数,所有函数可直接访问全局状态
- 缺点:会降低代码可测试性(单元测试时难以模拟不同状态),且容易引入全局状态耦合,不利于长期维护
代码示例(单例模式简化版):
class GameState { private: GameState() = default; // 私有构造函数,禁止外部实例化 static GameState instance; // 类内成员变量... public: static GameState& getInstance() { return instance; } // 成员函数... }; // 初始化单例实例 GameState GameState::instance;
之后函数可直接访问全局实例:
void gameSaver() { const GameState& state = GameState::getInstance(); // 使用state中的数据完成保存逻辑 } int gameLoader() { GameState& state = GameState::getInstance(); // 修改state中的数据完成加载逻辑 return 0; }
内容的提问来源于stack exchange,提问作者Pouya Tavakoli
相关产品推荐
相关产品推荐

