2010-06-17 50 views
11

Có lẽ đây không phải là một câu hỏi khó, nhưng tôi luôn hơi bối rối về cách xử lý kiểu String như một đối số trong Visual C++. Tôi đã phần sau đây để chức năng:Vượt qua một đối số bằng cách tham chiếu trong C++/CLI để gán lại ảnh hưởng đến người gọi

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

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

Sau khi gọi function_1, str_2 vẫn bằng null, nhưng những gì tôi muốn đạt được là str_2 bằng Test. Vì vậy, làm cách nào tôi có thể đạt được nội dung của str_1 được chuyển đến function_2?

Cảm ơn lời khuyên nào.

Trả lời

24

Sử dụng một tracking reference:

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

Giải thích: Đi qua String ^ cũng giống như đi qua một con trỏ. Thay đổi chỉ được thực hiện đối với bản sao tham chiếu cục bộ. String ^% giống như chuyển tham chiếu đến tham chiếu ... giống như khi bạn chuyển con trỏ tới con trỏ khi gọi một hàm sẽ thay đổi con trỏ ban đầu.

+0

Cảm ơn! Đã học được điều gì đó ngay hôm nay! – stefangachter

+0

@Agnel Tôi không hiểu lý do tại sao bạn nói rằng khi bạn chuyển một con trỏ chỉ các bản sao cục bộ của tham chiếu được thay đổi. Đầu tiên của tất cả một con trỏ không phải là một tham chiếu. Thứ hai, nếu bạn vượt qua một con trỏ trong c + + và sửa đổi dữ liệu nó trỏ đến, bạn không sửa đổi một bản sao cục bộ của dữ liệu. Tôi có bị lẫn lộn trong ngữ nghĩa hay không? – Ian

+0

@Ian, Ý tôi là nếu bạn chuyển một con trỏ và thay đổi giá trị của biến con trỏ (ngược lại với giá trị của dữ liệu nó trỏ tới), chỉ giá trị của biến con trỏ cục bộ mới thay đổi. Và có, nếu bạn sửa đổi dữ liệu một con trỏ trỏ đến, bản thân dữ liệu được sửa đổi và không phải là bản sao cục bộ. Không có bản sao dữ liệu cục bộ nào tồn tại; một bản sao cục bộ của con trỏ không tồn tại. –

Các vấn đề liên quan