我有一个非托管类,我是从C ++ Windows窗体(托管类)调用的。但是,我想将此类重新编写为ref类,但我不确定如何处理在非托管类中声明的全局数组成员。
作为一个例子,我写了一个非常简单的类,它以某种方式显示了我需要做什么。
public class test {
private:
int myArray[5][24];
public:
int assign(int i){
test::myArray[2][4] = i;
return 0;
}
int dosomething(int i){
return test::myArray[2][4] + i;
}
在这里,我有一个全局成员数组,我希望能够从类中的所有函数访问它。
在Windows窗体中,我有一个按钮和一个组合框。这样按下按钮时,它只调用类中的函数并显示结果。
private: System::Void thumbButton_Click(System::Object^ sender, System::EventArgs^ e) {
test my_class;
my_class.assign(5);
comboBox1->Text = my_class.dosomething(6).ToString();
}
现在,如果我尝试将类更改为ref类,则会出现错误,因为全局数组是不受管理的。我尝试用std :: vectors做这个,这比直接使用数组更好,但得到相同的错误。因此,如果有人能指出我将这个类重写为ref类的方法,我真的很感激。谢谢!
答案 0 :(得分:3)
我认为'global'不是非托管数组的正确单词,因为它包含在非托管类定义中。非托管数组也没有static
关键字,因此它是一个实例变量,它远不是全局变量。
无论如何,您所遇到的问题似乎是数组定义。 int myArray[5][24]
是一个非托管“对象”,无法直接包含在您的托管类中。 (您可以指向非托管对象,但不能指向内联非托管对象。)您可以将其切换为指向整数数组的指针,并处理malloc&免费,但是使用托管数组更简单。
以下是将该数组声明为托管的语法:
public ref class test
{
private:
array<int, 2>^ myArray;
public:
test()
{
this->myArray = gcnew array<int, 2>(5, 24);
}
int assign(int i)
{
this->myArray[2,4] = i;
return 0;
}
int dosomething(int i)
{
return this->myArray[2,4] + i;
}
};
数组类是根据数据类型和维数来模板化的,因此对于2D整数数组,array<int, 2>
就是你想要的。