如何移除C++非main文件中函数定义内的重复代码?
问题:抽取非main函数中的重复代码失效
我在cpp文件的readFile()函数里有大量重复逻辑,功能是逐字符读取文件内容,按|分隔提取字符串并存入不同对象,只有最后调用对象方法的部分不同。示例重复代码如下:
source.open("bookings.txt", std::ios::in); char c; source.get(c); while (c != '|'){ CurrentID.push_back(c); source.get(c); } object.setID(CurrentID);
我尝试把重复逻辑抽成Search函数:
void Search(std::ifstream x, char y, std::string z){ x.get(y); // 跳过前面的| while (y != '|'){ z.push_back(y); x.get(y); } }
但调用时程序直接跳过这个函数,从CurrentID.clear()跳到object->setPrice执行,完全没走抽取的函数逻辑。
问题根源
你的代码有三个关键问题:
- 文件流传值导致无效读取:
std::ifstream传值会创建原流的副本,副本的读取位置和原流无关,函数里读的是副本,原流根本没被修改,等于白操作。 - 字符串传值导致修改无效:
std::string传值会复制字符串,函数里对z的修改不会影响外部的CurrentID,外部字符串还是空的,后续stof(CurrentID)自然出问题。 - 未实际调用函数:你在第二个代码块里只写了函数声明,根本没调用
Search,这就是程序跳过函数的直接原因。
修复方案
1. 修正Search函数的参数传递
把文件流和字符串改成引用传递,同时在函数内清空目标字符串避免残留数据:
void Search(std::ifstream& x, char& y, std::string& z){ z.clear(); x.get(y); while (y != '|'){ z.push_back(y); x.get(y); } }
2. 正确调用函数
在需要替换重复代码的地方,先调用Search,再执行对象方法:
// 第一个代码块替换后 Search(source, c, CurrentID); object->setID(CurrentID); CurrentID.clear(); // 第二个代码块替换后 Search(source, c, CurrentID); object->setPrice(stof(CurrentID)); CurrentID.clear();
3. 更简洁的优化方案(可选)
可以把提取逻辑改成返回字符串的函数,省去临时变量CurrentID:
std::string readUntilDelimiter(std::ifstream& stream, char delimiter = '|'){ std::string result; char c; stream.get(c); while (stream && c != delimiter){ result += c; stream.get(c); } return result; }
调用时直接使用返回值:
object->setID(readUntilDelimiter(source)); object->setPrice(stof(readUntilDelimiter(source)));
内容的提问来源于stack exchange,提问作者Yaroslav Zabello
相关产品推荐
相关产品推荐

