2010-11-10 11 views
3

Je programme en C++ en utilisant TDD, ce qui suggère d'utiliser l'inversion de contrôle lors de la création d'objets (lors de la création d'objets de certaine classe, passer les objets construits à son constructeur). C'est bien, mais comment puis-je créer des objets requis pour le constructeur?Comment créer un objet requis pour le constructeur de classe en inversion de contrôle?

À l'heure actuelle, j'utilise une usine (que je peux facilement modifier pour mes tests unitaires), qui renvoie un shared_ptr pointant vers l'objet créé. Est-ce la bonne façon, ou existe-t-il de meilleures façons de le faire?

exemple très simplifié montre ce que je fais:

#include <iostream> 

struct A { 
    virtual ~A() { } 
    virtual void foo() = 0; 
}; 

struct B : A { 
    virtual ~B() { } 
    virtual void foo() { std::cout<<"B::foo()"<<std::endl; } 
}; 

struct C { 
    C(A *a) : a(a) { } 
    void DoSomething() { a->foo(); } 

    A *a; 
}; 

int main() { 
    C c(new B); 

    c.DoSomething(); 
} 

contre ceci:

#include <iostream> 

struct A { 
    virtual ~A() { } 
    virtual void foo() = 0; 
}; 

struct B : A { 
    virtual ~B() { } 
    virtual void foo() { std::cout<<"B::foo()"<<std::endl; } 
}; 

struct C { 
    C() : a() { } 
    void DoSomething() { a.foo(); } 

    B a; 
}; 

int main() { 
    C c; // the object of type B is constructed in the constructor 

    c.DoSomething(); 
} 

EDIT1

This link explique le IoC pour Java, mais comme vous le savez peut-être, en Java, vous pouvez faire quelque chose comme ceci:

class B 
{ 
}; 
class A 
{ 
    public: 
    A(B b) 
... 
}; 

... 
A objA(new B); // this doesn't work in c++ 
... 
+0

Tout lien avec le concept d'inversion de contrôle – Chubsdad

Répondre

2

Utilisez le modèle de conception Builder. Builder et Factory sont des modèles de conception très similaires, mais spécifiquement Builder crée un objet composé de plusieurs composants en construisant d'abord ses composants.

C'est ce que vous faites dans IOC. Vous construisez les composants puis passez-les en tant que paramètres à l'objet. Lorsque j'ai créé ce modèle (4 fois!), Les constructeurs stockent les constructeurs des objets paramètres et les représentations lexicographiques des informations scalaires. Vous pouvez également autoriser les vecteurs et les cartes.

La première chose dont vous avez besoin dans un système IOC est un fichier de configuration. Souvent (mais pas toujours) les composants sont chargés dans votre système via le chargement de la bibliothèque dynamique à l'exécution.

+0

+1 Cela fonctionnerait. Je n'ai pas besoin d'une flexibilité de temps d'exécution complète - je veux juste faciliter les tests unitaires (et permettre d'utiliser des simulacres). Pouvez-vous dire quel est le retour de votre constructeur? Aiguille? L'objet (ceci nécessite un constructeur de copie)? Pointeur partagé? Autre chose? –

+1

Les Builders sont des classes, et vous les utilisez pour créer votre object.Mine a une méthode getObject() qui est public et createObject() qui est privée et virtuelle et appelée par getObject() pour assurer une création unique mais multiple. createObject() doit renvoyer un pointeur, mais getObject renvoie un shared_ptr. createObject() renvoie un pointeur pour autoriser la covariance. My Builder fonctionne avec l'ObjectLoader qui lie les noms de paramètres aux constructeurs des autres objets dont il a besoin. – CashCow