构造函数注入

问题描述:

我知道代码丢失(有人会给负数)。但我只想知道在这种情况下你如何解决建设者注入问题?构造函数注入

class PresenterFactory 
{ 
public: 
    template<class TModel> 
    AbstractPresenter<TModel>* 
    GetFor(AbstractView<TModel> * view) 
    { 
     return new PresenterA(view, new FakeNavigator()); 
    } 
}; 

class ViewA : public AbstractView<ModelA> 
{ 
    static PresenterFactory factory; 
public: 
    ViewA(AbstractPresenter<ModelA> *presenter = factory.GetFor<ModelA>(this)) : 
    AbstractView<ModelA> (presenter) 
    { 
    } 

    // this one is also not working 
    // invalid use of ‘class ViewA’ 
    // ViewA() 
    // { 
    // this->ViewA(factory.GetFor<ModelA> (this)); 
    // } 
}; 

为什么不使用两个构造函数?

// constructor with one argument 
ViewA(AbstractPresenter<ModelA> *presenter) : AbstractView<ModelA> (presenter) 
{ 
} 

// constructor without arguments 
ViewA() : AbstractView<ModelA>(factory.GetFor<ModelA>(this)) 
{ 
} 

顺便提一下,this指针是仅在非静态成员函数有效。它不应该用于基类的初始化程序列表中。在构造函数之前调用基类构造函数和类成员构造函数。实际上,您已经将指向未构造对象的指针传递给另一个构造函数。如果其他构造函数访问任何成员或调用成员函数,结果将是未定义的。在所有施工完成之前,您不应该使用这个指针。

+0

就是这样。谢谢:) – 2009-10-15 19:52:52

+0

有关'这'的优秀点。将'this'传递给基类并不总是不好的,但这是一个危险例子的好例子。传入'GetFor'的基类子对象将被初始化,所以如果“PresenterA”的构造函数试图读取或修改'view'中的任何数据,那么它将读取垃圾,并且当构造函数写入的东西很可能会丢失对于AstractView 最终被调用。 – 2009-10-16 07:18:38

+0

尽管有些编译器会警告它,但在构造函数初始化程序列表中传递'this'是完全有效的。关键是它不应该被用在任何构造函数代码中。但有时候这是必要的,例如将其传递到其他位置以初始化引用成员。 – Tom 2009-10-16 13:51:14

public class ConstEx { 

    String name; 
    Integer id; 
    public ConstEx(String name, Integer id) { 

     System.out.println("--------Constructor Firs -------"); 
    } 

    public ConstEx(Integer id,String name) 
    { 
     System.out.println("-----Second Constructor--------"); 
    } 
} 




with th Following Configuration in xml 

<bean id="const1" class="com.spring.hari.springexample.ConstEx"> 
     <constructor-arg type="java.lang.Integer" > 
      <value>10</value> 
     </constructor-arg> 
     <constructor-arg type="java.lang.String" > 
      <value>100</value> 
     </constructor-arg> 
    </bean> 


Why First Constructor is called since i have mentioned the types even than it is calling first constructor