2010-04-12 5 views
2

Je vais créer une classe pour contenir une longue liste de paramètres qui seront passés à une fonction. Utilisons cet exemple plus court:C++ pointeur privé "fuite"?

class ParamList{ 

public: 
    ParamList(string& a_string); 
    string& getString(); //returns my_string 
private: 
    string& my_string; 
} 

Ma question est la suivante: my_string est privé, mais je retourne la référence. N'est-ce pas appelé quelque chose comme un pointeur privé qui fuit en C++? Est-ce que ce n'est pas une bonne pratique de programmation? Je veux que les appelants de getString puissent obtenir la référence et aussi la modifier.

Faites-le moi savoir s'il vous plaît.

Merci, JBU

edit1: les appelants utiliseront getString() et modifier la chaîne qui a été renvoyée.

+3

Avoir des références en tant que membres est une pratique douteuse, sauf si vous savez exactement ce que vous faites. Mais je ne vois pas de pointeurs dans ce code. –

+0

OK. Je ne sais pas ce que je fais. Que se passe-t-il si my_string est un pointeur et que getString renvoie un pointeur sur une chaîne? – jbu

+0

Il devrait toujours retourner une 'const string *' – David

Répondre

2

Tout d'abord, vous devez décider si le ParamList va posséder la chaîne ou juste "savoir à ce sujet". La façon dont vous l'avez écrit, avec string& my_string, signifie qu'il a juste une poignée sur la chaîne de quelqu'un d'autre. Dans ce cas, ce n'est pas (beaucoup) un problème pour certains de modifier la chaîne puisque ParamList ne la possède pas en premier lieu!

Si vous voulez ParamList d'avoir une copie maîtresse complète des paramètres (dépend du problème que vous essayez de résoudre), faire quelque chose comme ceci:

class ParamList{ 

public: 
    ParamList(const string& a_string); // do a strcpy in here. 

    const string& getString(); //returns my_string 
    void setString(const string& new_string); //do a strcpy here too. 
private: 
    string my_string; 
} 

Notez qu'il est probablement préférable d'utiliser set et obtenir des fonctions de toute façon plutôt que de renvoyer une référence non-const, juste pour que ParamList puisse avoir un peu plus de contrôle sur la façon dont ses membres sont modifiés.

+4

"Faire un strcpy" ??? –

+0

@Neil: raccourci pour "copier d'une chaîne à l'autre". – David

+3

Nom de la fonction dans la bibliothèque standard - possibilité de confusion: élevée. –

3

returing une référence privée est tout à fait correct tant que:

A. C'est une référence const, et que vous avez documenté lorsque cette référence peut être invalidée ou
B. Cette référence est destinée à être modifiée (par exemple std::vector<T>::operator[])

Bien qu'il existe des cas utiles pour renvoyer une référence non-const, vous devriez généralement l'éviter. Ceci est couvert dans Scott Meyers' Effective C++ (3ème édition, article 28): évitez de renvoyer des "poignées" aux objets internes de l'objet, si vous voulez jeter un coup d'œil.