如何简化C++中重复复制粘贴的代码 减少冗余if判断并封装为函数
代码精简方案
核心优化思路是把零散的资源属性统一结构化管理,复用重复逻辑,完全消除重复代码。
优化后完整实现方案
1. 统一定义资源类型与公共常量
把所有资源归类为枚举,公共偏移抽离出来避免重复存储:
#include <vector> #include <chrono> #include <thread> // 定义所有资源类型,新增资源只需在此处追加 enum class Resource : int { Energy, Minerals, Foods, Influence, Unity, Alloys, ConsumerGoods, Count // 标记资源总数量,用于数组长度声明 }; // 所有资源共用的前三级固定偏移,无需重复存储 const std::vector<DWORD> COMMON_OFFSETS = {0x168, 0x1B8, 0x30}; // 每个资源独有的最后一级偏移,顺序与Resource枚举一一对应 const DWORD RESOURCE_LAST_OFFSETS[] = {0x8, 0x10, 0x18, 0x38, 0x40, 0x4C, 0x54};
2. 重构零散变量为数组
代替原来独立声明的每个资源标记、资源指针:
// 作弊开关数组,顺序与Resource枚举一一对应 bool hackMenu[static_cast<int>(Resource::Count)] = {false}; // 资源指针数组,顺序与Resource枚举一一对应 uintptr_t* resourcePtrs[static_cast<int>(Resource::Count)];
3. 批量读取资源指针
代替原来逐行调用readOffset的重复代码:
for (int i = 0; i < static_cast<int>(Resource::Count); ++i) { std::vector<DWORD> fullOffsets = COMMON_OFFSETS; fullOffsets.push_back(RESOURCE_LAST_OFFSETS[i]); resourcePtrs[i] = readOffset(finallyAddress, fullOffsets); }
4. 封装通用资源处理函数
把重复的判断、赋值、复位、延时逻辑统一封装:
void processResource(uintptr_t* resPtr, bool& enableFlag, int addValue) { if (!enableFlag) return; *resPtr += addValue; enableFlag = false; std::this_thread::sleep_for(std::chrono::milliseconds(130)); }
5. 遍历处理所有资源,完全消除重复if
原来的6个if判断可以简化为1个循环:
for (int i = 0; i < static_cast<int>(Resource::Count); ++i) { processResource(resourcePtrs[i], hackMenu[i], add_resource); }
兼容原有结构的轻量化方案
如果不想改动原有offsets、cheats结构体的定义,可以用成员指针+模板做轻量化封装,也能大幅精简代码:
// 通用处理模板,无需修改原有结构体定义 template<typename T> void processCheat(uintptr_t* resPtr, bool cheats::*flag, T addValue) { if (!(hackMenu.*flag)) return; *resPtr += addValue; hackMenu.*flag = false; std::this_thread::sleep_for(std::chrono::milliseconds(130)); } // 原来的6个if块简化为6行调用,无重复逻辑 processCheat(minerals, &cheats::minerals, add_resource); processCheat(influence, &cheats::influence, add_resource); processCheat(alloys, &cheats::alloys, add_resource); processCheat(unity, &cheats::unity, add_resource); processCheat(foods, &cheats::foods, add_resource); processCheat(consumer_goods, &cheats::consumer_goods, add_resource);
内容的提问来源于stack exchange,提问作者Alexandr Milien
相关产品推荐
相关产品推荐

