我使用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++
...
答案 0 :(得分:2)
使用Builder设计模式。 Builder和Factory是非常相似的设计模式,但特别是Builder通过首先构建其组件来创建由多个组件组成的对象。
这就是你在国际奥委会所做的。您构建组件,然后将它们作为参数传递给对象。
当我创建此模型(4次!)时,构建器存储参数对象的构建器以及标量信息的词典表示。您还可以允许矢量和地图。
IOC系统中您需要的第一件事是配置文件。通常(但不总是)组件通过运行时动态库加载加载到系统中。