构造函数注入
问题描述:
我知道代码丢失(有人会给负数)。但我只想知道在这种情况下你如何解决建设者注入问题?构造函数注入
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
指针是仅在非静态成员函数有效。它不应该用于基类的初始化程序列表中。在构造函数之前调用基类构造函数和类成员构造函数。实际上,您已经将指向未构造对象的指针传递给另一个构造函数。如果其他构造函数访问任何成员或调用成员函数,结果将是未定义的。在所有施工完成之前,您不应该使用这个指针。
答
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
就是这样。谢谢:) – 2009-10-15 19:52:52
有关'这'的优秀点。将'this'传递给基类并不总是不好的,但这是一个危险例子的好例子。传入'GetFor'的基类子对象将被初始化,所以如果“PresenterA”的构造函数试图读取或修改'view'中的任何数据,那么它将读取垃圾,并且当构造函数写入的东西很可能会丢失对于AstractView最终被调用。 –
2009-10-16 07:18:38
尽管有些编译器会警告它,但在构造函数初始化程序列表中传递'this'是完全有效的。关键是它不应该被用在任何构造函数代码中。但有时候这是必要的,例如将其传递到其他位置以初始化引用成员。 – Tom 2009-10-16 13:51:14