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

时间:2016-09-23 22:21:20

标签: c++ oop c++11

我有许多使用公共类(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();
}

1 个答案:

答案 0 :(得分:1)

您可以定义类似这样的类:

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

然后,在main内,对其进行专门化并按照以下步骤对其进行初始化:

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

请注意,Modules<Module1, Module2> Module1。 因此,以下适用:

Module2

这也意味着,只要需要Module1 &m1 = modules; Module2 &m2 = modules; Modules<Module1, Module2>的引用,您就可以将引用传递给Module1,作为函数调用的示例。

在网络上查找 mixins ,了解有关此成语的详细信息。