2009-10-15 6 views
2

Je sais que le code est manquant (Quelqu'un donnera des nombres négatifs). Mais je veux seulement savoir comment résoudre l'injection du constructeur dans cette situation?Injection du constructeur

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

Répondre

4

Pourquoi ne pas utiliser deux constructeurs?

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

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

Par ailleurs, le pointeur this est valable uniquement dans les fonctions membres non statiques. Il ne doit pas être utilisé dans la liste d'initialisation pour une classe de base. Les constructeurs de classe de base et les constructeurs de membres de classe sont appelés avant ce constructeur. En effet, vous avez passé un pointeur vers un objet non construit vers un autre constructeur. Si ces autres constructeurs accèdent à des membres ou appellent des fonctions membres, le résultat ne sera pas défini. Vous ne devriez pas utiliser le pointeur this jusqu'à ce que toute la construction soit terminée.

+0

c'est tout. merci :) –

+0

Excellent point concernant «ceci». Ce n'est pas toujours mauvais de passer 'ceci' dans les classes de base, mais c'est un bon exemple d'un exemple dangereux. Le sous-objet de classe de base transmis à 'GetFor' ne sera pas initialisé, donc si le constructeur de "PresenterA" essaye de lire ou de modifier des données dans 'view', il lira les ordures et tout ce qu'il écrit sera perdu quand le constructeur pour AstractView est finalement appelée. –

+0

Même si certains compilateurs l'avertissent, il est parfaitement possible de passer 'this' dans la liste des initialiseurs du constructeur. La clé est qu'elle ne doit pas être * utilisée * dans le code du constructeur. Mais parfois, c'est nécessaire, par ex. pour le passer ailleurs pour initialiser un membre de référence. – Tom

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 
Questions connexes