0

我有一个非托管类,我从 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 类的方法,我将不胜感激。谢谢!

4

1 回答 1

3

我不认为“全局”是您的非托管数组的正确词,因为它包含在非托管类定义中。非托管数组也没有static关键字,所以它是一个实例变量,远不及全局。

无论如何,您遇到的问题似乎与数组定义有关。int myArray[5][24]是一个非托管的“对象”,不能直接包含在您的托管类中。(您可以拥有指向非托管对象的指针,但不能拥有内联非托管对象。)您可以将其切换为指向整数数组的指针,并处理 malloc 和 free,但使用托管数组要简单得多。

这是将该数组声明为托管的语法:

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;
    }
};

数组类以数据类型和维数为模板,因此对于整数的二维数组,array<int, 2>这就是您想要的。

于 2012-09-07T04:07:10.310 回答