Я программирую на c ++, используя TDD, который предлагает использовать инверсию управления при создании объектов (при создании объектов определенного класса, передавать построенные объекты его конструктору). Это нормально, но как мне создать объекты, необходимые для конструктора?
Сейчас я использую фабрику (которую я могу легко изменить для своих модульных тестов), которая возвращает 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
Эта ссылка объясняет IoC для Java, но, как вы знаете, в Java вы можете сделать что-то вроде этого:
class B
{
};
class A
{
public:
A( B b )
...
};
...
A objA( new B ); // this doesn't work in c++
...