2009-06-29 17 views
4

フレームワークまたはリフレクションを使用せずにC++で依存性注入を明示的に実装するにはどうすればよいですか?C++での依存性注入

私はファクトリを使ってauto_ptrまたはshared_ptrを返すことができました。これは良い方法ですか?

+3

私たちは流行語をC++でやっていません。 –

+0

よろしくお願いします、Neil! ^^ –

答えて

4

必要なサービスにshared_ptrを使用して、それを設定します。例:複数のオブジェクト(割り当て時に所有権を持ちます)で共有できないため、auto_ptrの使用は避けてください。

+0

これは非常に合理的に聞こえる。コードをテスト可能にするためにこれを行うのはいいですか?それとも良い選択肢がありますか? – frast

+0

あなたはあまりにも多くのパフォーマンスを失うことはありません、あなたのコードははるかに柔軟性とテスト可能になります! –

1

AFAIK依存性注入とは、別のコンポーネントが必要とするコンポーネントへのインタフェースがあることを意味します。

namespace ifc { 
    struct service { 
    virtual ~service() {} 
    virtual do_stuff(/*..*/) = 0; 
    }; 
} // ns ifc 

class ServiceProviderA : public ifc::service 
{ 
public; 
    do_stuff(/*..*/) { /*...*/ } 
}; 

class ServiceProviderB : public ifc::service {/*...*/}; 

class Client 
{ 
public; 
    client(ifc::service*); 
private: 
    ifc::service* m_service; 
}; 

私は推測することができますが、注入されたオブジェクトの寿命を管理する方法はあなたの質問ですか?

+0

あなたのコードは問題に非常に近いです。そして、はい、問題は注入されたオブジェクトの寿命を管理する方法です。 – frast

0

注入されたオブジェクトの所有権が依存オブジェクトに移っているとします。これは、スマートポインタの使用を避ける合成の生涯の問題を解決します。しかし、所有状況がスマートなポインターが重要な複雑な状況の場合は、選択肢になります。 dependetを基準として注入オブジェクトを渡すために注入オブジェクト、その良好未満の寿命を有することが確実である場合について

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

     ... 

     ~Car() 
     { 
     delete m_engine; 
     } 

    protected: 
     IEngine *m_pEngine; 
    } 

。これは、注入されたオブジェクトが依存オブジェクトによって所有されていないことを明確に示します。