2013-02-05 3 views
2

Je veux modifier un constructeur d'utiliser une liste d'initialisation comme dans l'exemple suivant:Nom caché dans la liste d'initialisation du constructeur

class Foo 
{ 
public: 
    Foo(std::wstring bar); 
private: 
    std::wstring bar; 
}; 

// VERSION 1: 

Foo::Foo(std::wstring bar) {this->bar = bar} 

// VERSION 2: 

Foo::Foo(std::wstring bar) : this->bar(bar) {} // ERROR! 

Malheureusement je ne peux pas la version 2 parce que vous ne pouvez pas utiliser le pointeur this pour les membres de données depuis (je devine) ils n'existent pas encore à ce point. Comment puis-je gérer le problème de masquage du nom (c'est-à-dire que mon paramètre et mon membre de données portent le même nom)?

Répondre

3

Vous n'en avez pas besoin. La première bar se référera à l'élément et le second bar se référera à l'argument:

Foo::Foo(std::wstring bar) : bar(bar) {} 
2

je changerais le nom de l'argument il est donc clair que ce qui est.

Foo::Foo(std::wstring b) : bar(b) {} 

Notez que vous n'avez pas strictement, mais mainteneurs futures de votre code va probablement vous remercier.

Autre option:

Il est courant en C++ pour désigner les variables membres privées avec une convention de nommage spéciale, par exemple un underscore final. Cela résout ce problème bien:

class Foo 
{ 
public: 
    Foo(std::wstring bar); 
private: 
    std::wstring bar_; 
}; 

Foo::Foo(std::wstring bar) : bar_(bar) {} 
2

Vous pouvez réellement faire:

Foo::Foo(std::wstring bar) : bar(bar) {} 

Tout initialiseur utilisé après la : doit se référer soit à une classe de base ou d'un membre. Cela signifie que votre membre bar ne sera pas caché à ce moment-là.

1

Le compilateur saura quoi faire ... il suffit de retirer ceci->

Questions connexes