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