yemat 2021-01-24 13:12 采纳率: 0%
浏览 8

C++程序设计、代码复用疑问

1.基类Base class(通用方法类)

2.派生类 test1(模式一控制类)、test2(模式二控制类)、test3(数据处理类)

3.开启10个线程,模式一或模式二为单独线程预处理数据,在预处理以后通知test3线程处理数据

4.test3通过单列事件模式等待通知

问题:

1.因为Base class为通用方法类(不允许修改),所以再有其他的类似派生类就需要重复复制代码,如何重新设计代码复用?

2.在test1或者test2线程内需要预处理很多数据,所以涉及很多分支和异常,会出现很多switch和try看起来很不优雅,如何解决?

 

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 14:36
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    1. 代码复用的设计方案

    1.1 使用抽象基类

    使用抽象基类AbstractControlClass来定义控制逻辑的接口。所有继承自这个基类的类都需要实现这个接口。

    class AbstractControlClass {
    public:
        virtual void control() = 0;
    };
    
    class ModeOneControl : public AbstractControlClass {
    public:
        void control() override { /* 模式一控制类的具体实现 */ }
    };
    
    class ModeTwoControl : public AbstractControlClass {
    public:
        void control() override { /* 模式二控制类的具体实现 */ }
    };
    

    然后创建具体的控制类:

    class Test1 : public ModeOneControl, public AbstractControlClass {
    public:
        // 实现ModeOneControl中的函数
        void control() override {}
    };
    
    class Test2 : public ModeTwoControl, public AbstractControlClass {
    public:
        // 实现ModeTwoControl中的函数
        void control() override {}
    };
    

    1.2 使用模板

    可以使用模板来简化代码复用。例如,你可以创建一个模板类DataProcessor,并提供一些预处理数据的方法。

    template<typename T>
    class DataProcessor {
    public:
        static T preprocess(T data) {
            return data; // 预处理逻辑
        }
    
        static T postprocess(T data) {
            // 处理后的数据
            return data; // 可以根据需要添加更多的处理步骤
        }
    };
    

    然后创建测试类,其中包含预处理和处理数据的功能:

    class Test3 : public DataProcessor<Test> {
    public:
        void processData(Test data) {
            // 数据预处理逻辑
            Test preprocessedData = preprocess(data);
            // 数据处理逻辑
            Test processedData = postprocess(preprocessedData);
    
            // 发送给Test4线程进行处理
            sendToTest4(processedData);
        }
    
    private:
        void sendToTest4(const Test& data) {
            // 向Test4发送处理结果
        }
    };
    

    2. 关于模式一和模式二的问题

    对于模式一(单一线程),可以通过共享内存或者全局变量来实现数据的同步。这将允许多个线程同时访问和更新相同的资源,从而减少切换线程的开销。

    对于模式二(多线程),可以考虑使用消息队列来保证各个线程之间的通信。这种方式避免了复杂的同步机制,并且可以确保所有线程都能及时获取到新的状态信息。

    这里给出简单的示例:

    #include <iostream>
    
    void threadFunction(int data) {
        std::cout << "Thread: " << data << std::endl;
    }
    
    int main() {
        int data = 0;
    
        std::thread t1(threadFunction, data); // 创建第一个线程
        std::thread t2(threadFunction, ++data); // 创建第二个线程
    
        t1.join(); // 等待第一个线程完成
        t2.join();
    
        std::cout << "Final value of 'data': " << data << std::endl;
        return 0;
    }
    

    在这个例子中,我们创建两个线程分别处理数据。由于只有一个主线程,其他线程不能直接访问共享的数据。

    评论

报告相同问题?

悬赏问题

  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算