Есть проблема с нестатической ссылкой в приложении 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 шт):
Я понимаю, что надо каким-то образом создать объект класса как глобальный вне всяких методов
Я думаю, что в этом и заключается некая ошибка. С этими 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".