2010-06-17 6 views
11

Probabilmente questa non è una domanda difficile, ma sono sempre un po 'confuso su come trattare il tipo String come argomento in Visual C++. Ho le seguenti funzioni:Passare un argomento per riferimento in C++/CLI in modo che la riassegnazione abbia effetto sul chiamante

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

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

Dopo aver chiamato function_1, str_2 è ancora pari a null, ma quello che voglio ottenere è che str_2 è uguale a Test. Quindi, come posso ottenere che il contenuto di str_1 venga passato a function_2?

Grazie per qualsiasi consiglio.

risposta

24

Utilizzare un tracking reference:

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

Spiegazione: Passando String ^ è come passare un puntatore. Le modifiche vengono apportate solo alla copia locale del riferimento. String ^% è come passare un riferimento a un riferimento ... proprio come si passa un puntatore a un puntatore quando si chiama una funzione che dovrebbe modificare il puntatore originale.

+0

Grazie! Ho imparato qualcosa oggi! – stefangachter

+0

@Agnel Non capisco perché hai detto che quando si passa un puntatore vengono cambiate solo le copie locali del riferimento. Prima di tutto un puntatore non è un riferimento. In secondo luogo, se si passa un puntatore in C++ e si modificano i dati a cui punta, non si modifica una copia locale dei dati. Sono stato confuso nella semantica o cosa? – Ian

+0

@Ian, volevo dire che se si passa un puntatore e si modifica il valore della variabile puntatore stessa (diversamente dal valore dei dati a cui punta), solo il valore della variabile puntatore locale cambierà. E sì, se si modificano i dati puntati da un puntatore, i dati stessi vengono modificati e non la copia locale. Non esiste una copia locale dei dati; esiste una copia locale del puntatore. –

Problemi correlati