2016-09-23 2 views
1

Ich habe viele Module (C++ Klassen), die eine gemeinsame Klasse verwenden (HW_util)Wie besser schreiben dieses C++ Programm

HW_util Klasse initialisiert tatsächlich die Hardware.

Alle Module werden mit der Adresse des HW_util-Objekts initialisiert. Ich habe 30+ Module und so 30 ungerade Zeilen, die nur die Initialisierung machen, und ich finde diesen Code hässlich. Gibt es einen besseren Weg, dies zu tun?

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(); 
} 
+3

Wenn Sie den Arbeitscode verbessern möchten, fragen Sie besser bei [SE Code Review] (http://codereview.stackexchange.com/) –

+0

Sie Code verwenden Vererbung, Vorlagen und andere C++ - Funktionen – Raindrop7

+0

Meine Frage wurde nach SE verschoben und dann zurück hier. Ich weiß nicht, wie diese Frage nicht legitim ist. Ich kann den echten Code hier nicht hinzufügen, und es wäre zu lang. – viktorzeid

Antwort

1

Sie können eine Klasse wie diese definieren:

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

Dann in Ihrem main, spezialisieren sie und initialisieren es, wie es folgt:

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

Beachten Sie, dass Modules<Module1, Module2>ist sowohl Module1 als auch Module2.
Somit gilt folgendes:

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

Dies bedeutet auch, dass Sie einen Verweis auf Modules<Module1, Module2> passieren kann, wenn ein Bezug entweder auf Module1 oder Module2 erforderlich ist, als Beispiel bei einem Funktionsaufruf.

Suchen Sie nach mixins im Internet für weitere Details zu diesem Idiom.

Verwandte Themen