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 クラスに変更しようとすると、グローバル配列が管理されていないためにエラーが発生します。これは、配列を直接使用するよりも優れたアプローチですが、同じエラーが発生します。したがって、誰かがこのクラスを 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;
    }
};

配列クラスは、データ型と次元数に基づいてテンプレート化されているため、整数の 2D 配列がarray<int, 2>必要です。

于 2012-09-07T04:07:10.310 に答える