2010-09-15 4 views
3

Dans le code suivant, j'utilise un pointeur vers une chaîne C++ dans la fonction change(). Y at-il une façon d'utiliser les opérateurs de la classe de chaînes lorsque vous travaillez avec un pointeur sur une chaîne?Pointeur vers une chaîne C++

Par exemple, at() fonctionne pour l'opérateur [], mais est-il possible d'utiliser l'opérateur []?

#include <string> 
#include <iostream> 

using namespace std; 

void change(string * s){ 

    s->at(0) = 't'; 
    s->at(1) = 'w'; 
    // s->[2] = 'o'; does not work 
    // *s[2] = 'o'; does not work 


} 

int main(int argc,char ** argv){ 

    string s1 = "one"; 

    change(&s1); 

    cout << s1 << endl; 

    return 0; 
} 
+0

's * [2]' est proche, mais pas assez près. Vous vouliez écrire '(* s) [2]'. Les opérateurs de Postfix se lient toujours plus fort que les opérateurs de préfixe, donc vous devez utiliser une parenthèse autour de '* s'. – sellibitze

Répondre

6

vous utilisez dans une question de priorité des opérateurs, essayez

(*s)[0] 
12

déréférencer:

(*myString)[4] 

Mais, je suggère au lieu d'un pointeur, en utilisant une référence:

void change(string &_myString){ 
    //stuff 
} 

Cela comme vous pouvez utiliser tout comme vous le feriez avec l'objet.

+0

Merci! Je l'ai eu comme référence, mais mon professeur dit de ne pas les utiliser parce que quand vous lisez la fonction appelez "change (s1);" vous ne vous attendez pas à ce que la variable soit modifiée. – mmmmaaaatttttttttttttt

+5

@mmmmaaaatttttttttttttttt: C'est une mauvaise raison de ne pas utiliser de référence. Les avantages de l'utilisation d'une référence sont qu'elle exprime clairement la condition que le paramètre ne peut pas être nul. Dans un grand projet, cela aide à préciser où les vérifications nuls sont nécessaires et supprime le potentiel de nombreuses vérifications redondantes. Vos fonctions doivent être clairement nommées de sorte que le comportement de mutations soit attendu de leur nom. «changer» va au moins un peu dans ce sens. –

+0

@mmmmaaaatttttttttttttt - Cela peut être un problème - lorsque l'appel de la fonction n'est pas aussi évident que change (s1) - mais un plus gros problème est de savoir si NULL est une valeur valide ou non. En dehors de la classe de votre professeur, utilisez une référence "si l'argument est requis et que la fonction ne stocke pas de pointeur ou n'affecte pas sa propriété" [Sutter & Alexandrescu, "C++ Coding Standards"]. –

3

Tout d'abord, pas de raison de passer un std::string par pointeur ici, utilisez une référence. Deuxièmement, je pense que cela pourrait fonctionner:

(*s)[i] 

Mais mieux serait:

void change(string &s) 
{ 
    s.at(0) = 't'; 
    s.at(1) = 'w'; 
    s[2] = 'o'; 
    s[2] = 'o';  
} 

vers le bas sur le déréférencement Cuts ainsi.

5

Une autre solution, pour être complet saké:

s->operator[](2) = 'o';