如何在控制反转中创建类构造函数所需的对象?

时间:2010-11-10 10:55:24

标签: c++ unit-testing tdd inversion-of-control

我使用TDD编写c ++编程,建议在创建对象时使用控制反转(在创建某些类的对象时,将构造对象传递给它的构造函数)。这很好,但是如何创建构造函数所需的对象?

现在,我正在使用一个工厂(我可以轻松更改我的单元测试),它返回指向创建对象的shared_ptr。 这是正确的方法,还是有更好的方法来做到这一点?

非常简化的例子演示了我在做什么:

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

反对这个:

#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解释了IoC for java,但正如您所知,在java中您可以这样做:

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

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

1 个答案:

答案 0 :(得分:2)

使用Builder设计模式。 Builder和Factory是非常相似的设计模式,但特别是Builder通过首先构建其组件来创建由多个组件组成的对象。

这就是你在国际奥委会所做的。您构建组件,然后将它们作为参数传递给对象。

当我创建此模型(4次!)时,构建器存储参数对象的构建器以及标量信息的词典表示。您还可以允许矢量和地图。

IOC系统中您需要的第一件事是配置文件。通常(但不总是)组件通过运行时动态库加载加载到系统中。