2010-06-17 4 views
11

Prawdopodobnie nie jest to trudne pytanie, ale zawsze jestem trochę zdezorientowany, jak traktować typ String jako argument w Visual C++. Mam następujący do funkcji:Przekaż argument przez odwołanie w C++/CLI, aby ponowne przypisanie wpłynęło na wywołującego.

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

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

Po wywołaniu function_1, str_2 jest nadal równa null, ale to, co chcę osiągnąć to, że str_2 jest równa Test. Jak więc osiągnąć, że treść str_1 została przekazana do function_2?

Dzięki za radę.

Odpowiedz

24

Użyj tracking reference:

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

Objaśnienie: Przechodząc String ^ jest jak przechodzącą wskaźnik. Zmiany są wprowadzane tylko do lokalnej kopii odwołania. String ^% jest jak przekazywanie odniesienia do odniesienia ... tak, jakbyś przekazał wskaźnik do wskaźnika podczas wywoływania funkcji, która powinna zmienić oryginalny wskaźnik.

+0

Dzięki! Nauczyłem się czegoś dzisiaj! – stefangachter

+0

@Agnel Nie rozumiem, dlaczego powiedziałeś, że po przejściu wskaźnika zmieniają się jedynie lokalne kopie odniesienia. Przede wszystkim wskaźnik nie jest odniesieniem. Po drugie, jeśli przekażesz wskaźnik w języku C++ i zmodyfikujesz dane, do których on wskazuje, nie modyfikujesz lokalnej kopii danych. Czy pomieszałem semantykę, czy co? – Ian

+0

@Ian, Co miałem na myśli to, że jeśli przekazać wskaźnik i zmienić wartość samej zmiennej wskaźnika (w przeciwieństwie do wartości danych wskazuje), zmieni się tylko wartość lokalnej zmiennej wskaźnikowej. I tak, jeśli zmodyfikujesz dane, na które wskazuje wskaźnik, same dane są modyfikowane, a nie lokalna kopia. Nie istnieje lokalna kopia danych; lokalna kopia wskaźnika istnieje. –

Powiązane problemy