You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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执行,完全没走抽取的函数逻辑。


问题根源

你的代码有三个关键问题:

  1. 文件流传值导致无效读取:std::ifstream传值会创建原流的副本,副本的读取位置和原流无关,函数里读的是副本,原流根本没被修改,等于白操作。
  2. 字符串传值导致修改无效:std::string传值会复制字符串,函数里对z的修改不会影响外部的CurrentID,外部字符串还是空的,后续stof(CurrentID)自然出问题。
  3. 未实际调用函数:你在第二个代码块里只写了函数声明,根本没调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:40:41