2010-06-17 9 views
11

Probablement ce n'est pas une question difficile, mais je suis toujours un peu confus sur la façon de traiter le type String comme un argument dans Visual C++. Je donne les résultats suivants aux fonctions:Passer un argument par référence dans C++/CLI de sorte que la réaffectation affecte l'appelant

void function_1(String ^str_1) 
{ 
    str_1 = gcnew String("Test"); 
} 

void function_2() 
{ 
    String ^str_2 = nullptr; 
    function_1(str_2); 
} 

Après avoir appelé function_1, str_2 est toujours égal à null, mais ce que je veux atteindre est que str_2 est égal à Test. Alors, comment puis-je atteindre que le contenu de str_1 est passé à function_2?

Merci pour tout conseil.

Répondre

24

Utilisez un tracking reference:

void function_1(String ^%str_1) 
{ 
    str_1 = gcnew String("Test"); 
} 

Explication: passage String ^ est comme le passage d'un pointeur. Les modifications sont uniquement apportées à la copie locale de la référence. String ^% est comme passer une référence à une référence ... tout comme vous passeriez un pointeur sur un pointeur lorsque vous appelez une fonction qui devrait changer le pointeur d'origine.

+0

Merci! J'ai appris quelque chose aujourd'hui! – stefangachter

+0

@Agnel Je ne comprends pas pourquoi vous avez dit que lorsque vous passez un pointeur, seules les copies locales de la référence sont modifiées. Tout d'abord un pointeur n'est pas une référence. Deuxièmement, si vous passez un pointeur en C++ et modifiez les données vers lesquelles vous pointez, vous ne modifiez pas une copie locale des données. Ai-je été mêlé à la sémantique ou quoi? – Ian

+0

@Ian, Ce que je voulais dire, c'est que si vous passez un pointeur et changez la valeur de la variable pointeur elle-même (par opposition à la valeur des données vers laquelle elle pointe), seule la valeur de la variable pointeur local changera. Et oui, si vous modifiez les données pointées vers un pointeur, les données elles-mêmes sont modifiées et non la copie locale. Aucune copie locale des données n'existe; une copie locale du pointeur existe. –