2010-06-17 11 views
11

Muhtemelen bu zor bir soru değildir, ancak Visual C++'da argüman olarak String tipini nasıl kullanacağım konusunda biraz kafam karışmış olur.C++/CLI'de bir argümanı referans olarak verin, böylece yeniden atama arayanı etkiler

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

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

function_1 çağırdıktan sonra str_2 hala null eşittir, ama ne ulaşmak istiyoruz str_2Test eşit olmasıdır: Ben işlevlerine aşağıdakilere sahip. Yani, nasıl str_1 içeriği function_2 geçirilir elde edebilirsiniz?

Her türlü öneriniz için teşekkürler.

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

Açıklama:String ^ geçen bir işaretçi geçen gibidir

cevap

24

bir tracking reference kullanın. Değişiklikler sadece referansın yerel kopyası için yapılır. String ^%, bir referansa bir referans iletmek gibidir ... tıpkı orijinal işaretçiyi değiştirmesi gereken bir işlevi çağırırken bir işaretçiye bir işaretçiyi gösterdiğiniz gibi.

+0

teşekkürler! Bugün bir şey öğrendim! – stefangachter

+0

@Agnel Neden bir işaretçiyi geçtiğinizde, yalnızca referansın yerel kopyalarının değiştirildiğini söylemediğini anlamıyorum. Öncelikle bir işaretçi referans değildir. İkinci olarak, C++ 'da bir işaretçiyi geçirirseniz ve işaret ettiği verileri değiştirirseniz, verilerin yerel bir kopyasını değiştirmezsiniz. Semantiğe karışmış mıydım? – Ian

+0

@Ian, Demek istediğim, bir işaretçiyi iletir ve işaretçi değişkeninin değerini değiştirirse (işaret ettiği verinin değerinin tersine), sadece yerel işaretçi değişkenin değeri değişir. Ve evet, bir işaretçinin işaret ettiği verileri değiştirirseniz, verilerin kendisi de yerel kopyada değiştirilmez. Verilerin yerel kopyası yok; işaretçinin yerel bir kopyası var. –

İlgili konular