代码之家  ›  专栏  ›  技术社区  ›  BЈовић

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

  •  3
  • BЈовић  · 技术社区  · 14 年前

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

    这是正确的方法,还是有更好的方法?

    非常简单的示例演示了我正在做的事情:

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

    编辑1

    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 回复  |  直到 14 年前
        1
  •  2
  •   CashCow    14 年前

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

    当我创建这个模型时(4次!)建造者存储参数对象的建造者和标量信息的字典表示。也可以允许向量和贴图。

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