2011-07-13 6 views
4

En C++, j'essaie d'émuler comment Java gère les appels à son constructeur. Dans mon code Java, si j'ai 2 constructeurs différents et que je veux avoir un appel de l'autre, j'utilise simplement le mot-clé this. Exemple:"this" ne peut pas être utilisé comme une fonction

public Constructor1(String s1, String s2) 
{ 
    //fun stuff here 
} 

public Constructor2(String s1) 
{ 
    this("Testing", s1); 
} 

Avec ce code, par instanciation d'un objet avec Constructor2 (en passant dans une seule chaîne), il suffit d'appeler alors Constructor1. Cela fonctionne très bien en Java mais comment puis-je obtenir des fonctionnalités similaires en C++? Lorsque j'utilise le mot-clé this, il se plaint et me dit 'this' cannot be used as a function.

+1

Vous ne pouvez pas le faire comme ça avec C++, vous devez faire quelque chose comme MyObject * x = new MyObject ("Test , s1 ") – Eddie

Répondre

5

Vous pouvez écrire une fonction parlementaire init pour un tel emploi, comme indiqué ci-dessous:

struct A 
{ 
    A(const string & s1,const string & s2) 
    { 
     init(s1,s2); 
    } 
    A(const string & s) 
    { 
     init("Testing", s); 
    } 
private: 

    void init(const string & s1,const string & s2) 
    { 
     //do the initialization 
    } 

}; 
+0

+1 pour combiner les surcharges de constructeurs avec l'initialisation par défaut comme je l'aurais fait. – AJG85

+0

Les arguments 'string' devraient être' std :: string const & '. –

+0

@David: Oui. C'est mieux. Édité. – Nawaz

3

Vous ne pouvez pas atteindre cet objectif en C++. La solution de contournement consiste à créer un seul constructeur avec des paramètres par défaut.

par exemple.

class Foo { 
    public: 
     Foo(char x, int y=0); // this line combines the two constructors 
     ... 
}; 

Vous pouvez également utiliser une méthode distincte qui contient le code commun. Ensuite, dans vos deux constructeurs, vous appelez la méthode helper avec les arguments appropriés.

+0

Ce n'est pas la même chose que l'OP veut. Il veut 'Foo (0, x)' pas 'Foo (x, 0)'. – Nawaz

+0

Le code fourni par l'OP était juste un exemple. Je crois en général qu'il veut juste un moyen d'appeler un constructeur différent. Mais oui, dans ce cas particulier, vous devrez utiliser la seconde solution avec une méthode d'aide séparée. – tskuzzy

-1

Une autre façon:

Foo(int a){ *this = Foo(a,a); } 
Foo(int a, int b): _a(a), _b(b){} 

Ce ne est pas efficace mais son semblable à ce que vous voulez. Cependant je ne suggère pas cette option car l'option proposée ci-dessus est meilleure (en terme d'efficacité). Je viens de poster ceci pour montrer une manière différente de le faire.

+0

On s'attend à ce que l'opérateur d'affectation prenne soin de libérer les ressources détenues par l'objet auquel il est assigné. Méfiez-vous de l'utiliser, non pas à cause d'inefficacités possibles, mais à cause de la justesse. Puisque l'objet n'est pas encore entièrement construit, qu'advient-il de l'assignation de ressources, mais que ce n'est pas encore le cas? –

+0

Oui désolé je n'ai pas mentionné mon hypothèse. S'il y a de la mémoire dynamique allouée dans la classe Foo, il y a une chance pour le (s) bug (s). Mais dans ce qui précède, j'ai supposé que l'opérateur = (const Foo &) utilisé une copie superficielle. – dchhetri

9

Cela sera possible en C++ 11 avec la délégation du constructeur:

class Foo { 
public: 
    Foo(std::string s1, std::string s2) { 
     //fun stuff here 
    } 

    Foo(std::string s1) : Foo("Testing", s1) {} 
}; 
Questions connexes