2009-10-15 171 views
2

我知道代碼丟失(有人會給負數)。但我只想知道在這種情況下你如何解決建設者注入問題?構造函數注入

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)); 
    // } 
}; 

回答

4

爲什麼不使用兩個構造函數?

// 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

0
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