cli ++ — перенос класса C ++ в класс ref (неуправляемый на управляемый)

У меня есть неуправляемый класс, который я вызываю из C ++ Windows Form (управляемый класс). Однако я хотел бы переписать этот класс как 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;
}

Здесь у меня есть глобальный массив членов, к которому я хочу иметь доступ из всех функций класса.

В форме окна у меня есть кнопка и поле со списком. Таким образом, когда кнопка нажата, она просто вызывает функции в классе и отображает результаты.

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

Решение

Я не думаю, что «глобальный» — правильное слово для вашего неуправляемого массива, так как он содержится в определении неуправляемого класса. Неуправляемый массив не имеет 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;
}
};

Класс массива основан на типе данных и количестве измерений, поэтому для двумерного массива целых чисел array<int, 2> это то, что вы хотите.

3

Другие решения

Других решений пока нет …