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

请求实现符合描述的C++管道架构并补充组件连接逻辑

符合设计的完整C++实现

核心设计说明

  • Source:数据来源接口,提供readsome方法读取数据。
  • Sink:数据输出接口,提供writesome方法写入数据。
  • Filter:同时继承Source和Sink的抽象类,作为数据处理中间层的基类,子类可实现具体的转换逻辑。
  • Pipe:特殊的Filter,仅做数据透传,不修改内容。

完整代码实现

#include <cstdio>
#include <string>
#include <algorithm>

class Source {
public:
    virtual std::string readsome() = 0;
    virtual ~Source() = default;
};

class Sink {
public:
    virtual void writesome(const std::string& s) = 0;
    virtual ~Sink() = default;
};

// Filter抽象类:同时实现Source和Sink,提供缓冲区暂存数据
class Filter : public Source, public Sink {
protected:
    std::string buffer;
};

// Pipe类:直接透传数据的Filter
class Pipe : public Filter {
public:
    void writesome(const std::string& s) override {
        buffer += s;
    }

    std::string readsome() override {
        std::string data = buffer;
        buffer.clear();
        return data;
    }
};

// 标准输入Source实现
class Stdin : public Source {
public:
    std::string readsome() override {
        char buf[4096];
        size_t nread = fread(buf, 1, sizeof(buf), stdin);
        return std::string(buf, nread);
    }
};

// 标准输出Sink实现
class Stdout : public Sink {
public:
    void writesome(const std::string& s) override {
        fwrite(s.c_str(), 1, s.size(), stdout);
    }
};

// 字符替换Filter实现
class Tr : public Filter {
    const char from;
    const char to;

public:
    Tr(char f, char t) : from(f), to(t) {}

    // 接收数据并处理,存入缓冲区
    void writesome(const std::string& s) override {
        std::string processed = s;
        std::replace(processed.begin(), processed.end(), from, to);
        buffer += processed;
    }

    // 输出处理后的数据
    std::string readsome() override {
        std::string data = buffer;
        buffer.clear();
        return data;
    }
};

// 辅助函数:从Source读取数据并写入Sink
void pipe_data(Source& src, Sink& dest) {
    std::string data;
    while (!(data = src.readsome()).empty()) {
        dest.writesome(data);
    }
}

int main() {
    // 实例化各个组件
    Stdin input;
    Tr tr_filter('a', 'x'); // 将所有'a'替换为'x'
    Stdout output;

    // 数据流动路径:Stdin → Tr过滤器 → Stdout
    pipe_data(input, tr_filter); // 输入数据写入Tr(Tr作为Sink)
    pipe_data(tr_filter, output); // Tr处理后的数据写入输出(Tr作为Source)

    return 0;
}

运行说明

编译运行后,输入任意包含字符'a'的文本,按下Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)结束输入,程序会将所有'a'替换为'x'并输出到控制台。

内容的提问来源于stack exchange,提问作者malat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:01:52