Есть проблема с нестатической ссылкой в приложении WinForms

Пишу C++ приложение в формах, есть метод для вывода в таблицу dataGridView данных:

//Метод, выписывающий строку в таблицу
inline void Interface1::MyForm::writeRow(int id, String^ who, String^ what) {
    this->dataGridView1->Rows->Add();
    this->dataGridView1->CurrentRow->Cells[0]->Value = id;
    this->dataGridView1->CurrentRow->Cells[1]->Value = who;
    this->dataGridView1->CurrentRow->Cells[0]->Value = what;

}

Также есть метод, который создает мьютекс и по идее должен вызывать и передавать данные в writeRow

DWORD WINAPI Beefuction(CONST LPVOID lpParam) {
    CONST HANDLE hMutex = (CONST HANDLE)lpParam;
    stringstream ss;
    ss << this_thread::get_id();
    int id = std::stoi(ss.str());
    Interface1::MyForm::writeRow(id, "Пчела", "Начала работу");
...
}

К сути проблемы. в строке Interface1::MyForm::writeRow(id, "Пчела", "Начала работу"); подчеркнуто студией Interface1::MyForm::writeRow и написана ошибка "E0245 нестатическая ссылка не член должна указываться относительно заданного объекта"

пространство имен Interface1 содержит в себе класс MyForm.

так выглядит main

//точка входа формы
[STAThreadAttribute]
int main() {
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);

    //Interface1 - пространство имен данного проекта
    Interface1::MyForm form;
    Application::Run(% form);


    return 0;
}

пытаюсь вынести объявление form над мейном, чтобы использовать ее как глобальную в Beefuction, снова ругается и пишет "E1968 переменная со статической длительностью хранения не может относиться к типу ссылочного класса"

Я понимаю, что надо каким-то образом создать объект класса как глобальный вне всяких методов, но как это осуществить не могу придумать.


Вопрос решился, пришлось немного повозиться с проектом. Если тут как-то можно передавать ссылки, могу отдельно в лс скинуть(если тут таковой имеется, конечно).


Ответы (1 шт):

Автор решения: S.H.

Я понимаю, что надо каким-то образом создать объект класса как глобальный вне всяких методов

Я думаю, что в этом и заключается некая ошибка. С этими C++ CLR - приложениями голову сломаешь.

Смотрите.

Вот у вас есть "программа". Она - в "единственном экземпляре" (внутри пространства имен программы). Именно поэтому возможен вызов Application::EnableVisualStyles(); и Application::Run(% form);. Это то, что - с некоторыми оговорками - можно назвать "статический метод статического класса".

А вот внутри программы есть форма. Она - не такая, как программа. Для каждой формы есть "тип" и "экземпляр". "тип" - это "форма, к примеру, с заголовком 'моя программа!', одним текстовым полем и кнопкой "Ок". Это именно то, что создаётся в строке Interface1::MyForm form;: Interface1::MyForm - это тип, а form - это экземпляр этого типа.

Экземпляр типа Interface1::MyForm и именем form создаётся и "скармливается" методу Run класса Application. Это - так называемая "главная форма" Вашего приложения.

С этой логикой не надо бороться. С ней надо смириться и идти дальше. И вместо

 Interface1::MyForm::writeRow(id, "Пчела", "Начала работу");

написать

 form::writeRow(id, "Пчела", "Начала работу");

Так стало понятнее?

Вообще, всё это можно свести к такоему совету: поставьте поддержку C# и сделайте в C# тот же самый проект - просто чтобы посмотреть, как там всё создаётся и вызывается. Там синтаксис гораздо проще. Если там всё станет понятно - смело перепишите на этом странном "C++ CLR".

→ Ссылка