【问题标题】:How to create object required for the class constructor in inversion of control?如何在控制反转中创建类构造函数所需的对象?
【发布时间】:2010-11-10 10:55:23
【问题描述】:

我正在使用 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 解释了 Java 的 IoC,但您可能知道,在 java 中您可以这样做:

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

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

【问题讨论】:

  • 控制反转概念的任何链接

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


【解决方案1】:

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

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

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

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

【讨论】:

  • +1 那行得通。我不需要完全的运行时灵活性——我只想简化单元测试(并允许使用模拟)。你能告诉你的建设者返回的是什么吗?指针?对象(这需要复制构造函数)?共享指针?还有什么?
  • Builders 是类,你可以使用它们来创建你的对象。我的 getObject() 方法是公共的,createObject() 是私有的和虚拟的,由 getObject() 调用以确保一次-只有创造,但多重获得。 createObject() 应该返回一个指针,但 getObject 返回一个 shared_ptr。 createObject() 返回一个指针以允许协方差。 My Builder 与 ObjectLoader 一起使用,它将参数名称绑定到它需要的其他对象的构建器。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2017-11-18
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
相关资源
最近更新 更多