2010-06-17 16 views
11

Probablemente esta no sea una pregunta difícil, pero siempre estoy un poco confundido sobre cómo tratar el tipo String como un argumento en Visual C++. Tengo las siguientes funciones:Pasar un argumento por referencia en C++/CLI, por lo que la reasignación afecta a la persona que llama

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

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

Después de llamar function_1, str_2 sigue siendo igual a null, pero lo que queremos lograr es que str_2 es igual a Test. Entonces, ¿cómo puedo lograr que el contenido de str_1 se pase al function_2?

Gracias por cualquier consejo.

Respuesta

24

Utilice un tracking reference:

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

Explicación: PasandoString ^ es como pasar un puntero. Los cambios solo se realizan en la copia local de la referencia. String ^% es como pasar una referencia a una referencia ... al igual que pasar un puntero a un puntero al llamar a una función que debería cambiar el puntero original.

+0

Gracias! ¡Aprendí algo hoy! – stefangachter

+0

@Agnel No entiendo por qué dijiste que cuando pasas un puntero solo cambian las copias locales de la referencia. En primer lugar, un puntero no es una referencia. En segundo lugar, si pasa un puntero en C++ y modifica los datos a los que apunta, no está modificando una copia local de los datos. ¿Me confundí en la semántica o qué? – Ian

+0

@Ian, lo que quise decir es que si pasa un puntero y cambia el valor de la variable del puntero (a diferencia del valor de los datos a los que apunta), solo cambiará el valor de la variable del puntero local. Y sí, si modifica los datos a los que apunta un puntero, los datos en sí se modifican y no la copia local. No existe una copia local de los datos; una copia local del puntero existe. –

Cuestiones relacionadas