2009-06-29 17 views
4

Wie implementiere ich Dependance Injection in C++ explizit ohne Verwendung von Frameworks oder Reflektion?Dependency Injection in C++

Ich könnte eine Fabrik verwenden, um ein auto_ptr oder ein shared_ptr zurückzugeben. Ist das ein guter Weg?

+3

Wir machen dieses Schlagwort Zeug in C++ nicht. –

+0

Gut für dich, Neil! ^^ –

Antwort

4

Verwenden Sie einfach einen shared_ptr für den Dienst, den Sie benötigen, und nehmen Sie einen Setter dazu. Z.B .:

class Engine; 

class Car { 
public: 
    void setEngine(shared_ptr<Engine> p_engine) { 
     this->m_engine = p_engine; 
    } 

    int onAcceleratorPedalStep(int p_gas_pedal_pressure) { 
     this->m_engine->setFuelValveIntake(p_gas_pedal_pressure); 
     int torque = this->m_engine->getTorque(); 
     int speed = ... //math to get the car speed from the engine torque 
     return speed; 
    } 

protected: 
    shared_ptr<Engine> m_engine; 
} 

// (now must create an engine and use setEngine when constructing a Car on a factory) 

Vermeiden auto_ptr verwenden, weil Sie es durch mehr als ein Objekt nicht teilen können (es überträgt das Eigentum bei der Zuordnung).

+0

Das klingt sehr vernünftig. Ist es in Ordnung, dies nur zu tun, um den Code testbar zu machen, oder gibt es bessere Alternativen? – frast

+0

Es ist in Ordnung, Sie werden nicht zu viel Leistung verlieren, und Ihr Code wird viel flexibler und testbar sein! –

1

AFAIK Dependency Injection bedeutet nur, dass es eine Schnittstelle zu einer Komponente gibt, die von einer anderen benötigt wird.

Ich kann nur raten, aber ist Ihre Frage, wie man die Lebensdauer des injizierten Objekts verwalten?

+0

Ihr Code ist dem Problem sehr nahe. Und ja, die Frage ist, wie man die Lebensdauer injizierter Objekte verwaltet. – frast

0

Wie geht man davon aus, dass das Eigentum des injizierten Objekts auf das abhängige Objekt übertragen wird? Dies wird das Lebensdauerproblem für die Zusammensetzung lösen, wobei die Verwendung von intelligenten Zeigern vermieden wird. Aber für komplexe Situationen, in denen Besitz zählt, sind intelligente Zeiger die richtige Wahl.

class Car { 
    public: 
     Car(IEngine *pEngine) { 
     m_pEngine = pEngine; 
     } 

     ... 

     ~Car() 
     { 
     delete m_engine; 
     } 

    protected: 
     IEngine *m_pEngine; 
    } 

Für die Fälle, in denen unterhaltspflichtige ist sicher weniger Lebensdauer zu haben als die injizierten Objekt, ist es besser, injizierten Objekt als Referenz übergeben. Dies zeigt deutlich an, dass das injizierte Objekt nicht dem abhängigen Objekt gehört.