c++ - 如何更好地编写这个C++程序

标签 c++ oop c++11

<分区>

我有很多使用公共(public)类 (HW_util) 的模块(C++ 类)

HW_util 类实际初始化硬件。

所有模块都使用 HW_util 对象的地址进行初始化。我有 30 多个模块和 30 多行只做初始化的代码,我发现这段代码很难看。 有更好的方法吗?

class HW_Util
{
    InitHW();
    Functionality1_onHW();
    Functionality2_onHW();
    ..
    CleanupHW();
};


class Module1
{
    Module1(HW_Util *util) { m_Util = util; }
    ..
    HW_Util *m_Util;    

    void DoSomething()
    {
        //uses m_Util to do something
    }
};

class Module2
{
    Module2(HW_Util *util) { m_Util = util; }
    ..
    HW_Util *m_Util;    

    void DoSomething()
    {
        //uses m_Util to do something
    }
};

...
//I have around 30 such modules..
...



void main()
{
    HW_Util util;

    Module1 mod1(&util);    //I am passing util to all these modules, and I have around 30 such modules, ugly code
    Module1 mod1(&util);
    Module3 mod1(&util);
    Module4 mod1(&util);
    Module5 mod1(&util);


    util.InitHW();  //actually fill up the util

    mod1.DoSomething();
    mod2.DoSomething();
    ..


    util.CleanupHW();
}

最佳答案

你可以像这样定义一个类:

template<typename... M>
struct Modules: M... {
    Modules(HW_Util *util): M...{util} {}
};

然后,在您的 main 中, 专门化它并初始化它如下:

Modules<Module1, Module2> modules{&util};

请注意 Modules<Module1, Module2> 两者都是Module1Module2 .
因此,以下适用:

Module1 &m1 = modules;
Module2 &m2 = modules;

这也意味着您可以传递对 Modules<Module1, Module2> 的引用每当引用 Module1Module2是必需的,例如函数调用。

在网络上查找 mixins 以获取有关此习语的更多详细信息。

关于c++ - 如何更好地编写这个C++程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39670354/

相关文章:

shell - 有哪些基于对象的 shell ?

c++ - 来自多个线程的steady_clock::now 的值是否与内存顺序一致?

c++ - VC++ : Performance drop x20 when more threads than cpus but not under g++

c++ - 是否可以在实现文件中使用命名空间或等效项来避免在每个函数前加上类名?

c++为什么虚拟继承允许防止进一步继承?

c++ - 结果不同; c++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)

java - 为什么方法体内的 boolean 标志是一个坏主意?

c++ - 问题 C1083 : cannot open include file: 'chrono' : no such file or directory pops out

c++ - 在 Opengl ES 2.0 VBO 中使用 Eigen::Vector3f

oop - 我可以根据参数的数量重载类型绑定(bind)过程吗?