.net C++/CLI将字符串^作为跟踪引用传递不';I don’我没有按预期工作
我在VS2010中使用C++/CLI。感谢您的回答,我了解到在C++/CLI中,您通过引用传递对象,如下所示.net C++/CLI将字符串^作为跟踪引用传递不';I don’我没有按预期工作,.net,c++-cli,.net,C++ Cli,我在VS2010中使用C++/CLI。感谢您的回答,我了解到在C++/CLI中,您通过引用传递对象,如下所示 voin func(String ^ %string){ //modify string } 我想做的是将一些参数传递给GetInput表单的构造函数。然后将它们从用户输入修改到此表单。当表单关闭时,调用方表单将获得在GetInput表单中输入的值 对于我来说,它使用的是列表,而不是字符串^。代码如下: public ref class GetInput : public System
voin func(String ^ %string){
//modify string
}
我想做的是将一些参数传递给GetInput
表单的构造函数。然后将它们从用户输入修改到此表单。当表单关闭时,调用方表单将获得在GetInput
表单中输入的值
对于我来说,它使用的是列表
,而不是字符串^
。代码如下:
public ref class GetInput : public System::Windows::Forms::Form
{
public:
List<double>^ _data;
String ^ _string_data;
GetInput(List<double>^ %data, String ^ %string_data){
_data = data;
_string_data = string_data;
//this code is here just for the sake of an example,
//it's actually in one of the methods
_data->Add(0.5);
_string_data = "15";
}
//void buttonClickHandler where i actually want to modify data and string_data
}
我需要将传递给构造函数的指针保存为类成员,然后在其中一个成员函数中更改该指针指向的数据
但是C++/ClI跟踪引用是不同的
认为“追踪参考资料”有神奇之处,可能是你在这里遇到麻烦的原因。C++/CLI语言和文档使这一点显得繁重,它是为C++程序员编写的。事实上,这一切都没什么不同
它只是一个指针
它的行为也完全像一个指针,无论是在处理器上还是在语法上。它唯一“特别”的地方是垃圾收集器可以找到它。这是必要的,这样它才能完成它的工作。C++/CLI设计人员选择使用^
而不是*
,因为他们有限制。普通类,例如,不能使其成为非托管类的成员。GC无法知道它在内存中的位置,因此无法完成其工作
你的问题很简单,你有两个指针<代码>字符串数据和字符串数据
。请注意,您选择的名称并不能完全帮助您正确使用它。您更新了_string_数据指针,赋值后它现在指向“15”。但是不是通过引用传递的指针,它仍然指向原始字符串。因此,当然不会将任何更改传播回调用方。不知道目的是什么,但武断地:
_string_data = "15";
string_data = _string_data;
现在,调用方还将看到其引用更新为“15”。两个指针现在都指向同一个对象
请注意,List
参数也是错误的。您没有更新数据指针。您也不需要这样做,因为您没有创建新的列表对象。您的代码只修改了对象,而没有修改指向该对象的指针。因此,通过引用传递它是完全没有必要的
还有一个细节与这个问题有关。请注意,您通过调用列表对象的Add()方法修改了它。但是不能对字符串执行相同的操作。它是不可变的,它的任何方法和属性都不允许您修改它的内容。这给了它非常理想的行为,字符串总是线程安全的,并且作为参数传递给方法总是安全的。确保它永远不会被修改。它的行为就像一个值
或者换句话说,您必须通过引用传递字符串指针以将更改传播回调用方
注意列表不是不可变的,您的Add()调用使对象发生了彻底的变化。使用您的类的客户端程序员不太可能期望这种情况发生。C++中的const关键字是表示差异的好方法。然而,它在C++/CLI中工作得并不好,其他.NET语言对它并不了解。您可以在声明中使用const,但它不能在运行时强制执行
但是C++/ClI跟踪引用是不同的
认为“追踪参考资料”有神奇之处,可能是你在这里遇到麻烦的原因。C++/CLI语言和文档使这一点显得繁重,它是为C++程序员编写的。事实上,这一切都没什么不同
它只是一个指针
它的行为也完全像一个指针,无论是在处理器上还是在语法上。它唯一“特别”的地方是垃圾收集器可以找到它。这是必要的,这样它才能完成它的工作。C++/CLI设计人员选择使用^
而不是*
,因为他们有限制。普通类,例如,不能使其成为非托管类的成员。GC无法知道它在内存中的位置,因此无法完成其工作
你的问题很简单,你有两个指针<代码>字符串数据
和字符串数据
。请注意,您选择的名称并不能完全帮助您正确使用它。您更新了_string_数据指针,赋值后它现在指向“15”。但是不是通过引用传递的指针,它仍然指向原始字符串。因此,当然不会将任何更改传播回调用方。不知道目的是什么,但武断地:
_string_data = "15";
string_data = _string_data;
现在,调用方还将看到其引用更新为“15”。两个指针现在都指向同一个对象
请注意,List
参数也是错误的。您没有更新数据指针。您也不需要这样做,因为您没有创建新的列表对象。您的代码只修改了对象,而没有修改指向该对象的指针。因此,通过引用传递它是完全没有必要的
还有一个细节与这个问题有关。请注意,您通过调用列表对象的Add()方法修改了它。但是不能对字符串执行相同的操作。它是不可变的,它的任何方法和属性都不允许您修改它的内容。这给了它非常理想的行为,字符串总是线程安全的,并且作为参数传递给方法总是安全的。确保它永远不会被修改。它的行为就像一个值
或者换句话说,您必须通过引用传递字符串指针以将更改传播回调用方
请注意,列表不是不可变的,您的Add()调用使obj发生了彻底的变化