Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объявление статического члена класса - ошибка при сборке - C++ WinAPI / 8 сообщений из 8, страница 1 из 1
28.07.2017, 08:54
    #39496428
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объявление статического члена класса - ошибка при сборке - C++ WinAPI
Есть такой код:

Код: plaintext
1.
2.
3.
4.
5.
6.
class CMyClass
{
    private HWND myWindowHWND;
    ... 
    public static void MyFunction();
}



Всё компилируетcя и собирается нормально. Но мне нужно использовать myWindowHWND в MyFunction. Для этого он должен быть статическим. Если пишу так

Код: plaintext
1.
private static HWND myWindowHWND


то получаю ошибку:

error LNK2001: неразрешенный внешний символ ""private: static struct HWND__ * CMyClass::myWindowHWND" (?mainHWND@CMyClass@@0PAUHWND__@@A)"

Смысл сообщения мне понятен, непонятно, как это связано с объявлением static?
И как сделать так, чтобы я мог использовать myWindowHWND в MyFunction?
...
Рейтинг: 0 / 0
28.07.2017, 09:08
    #39496432
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объявление статического члена класса - ошибка при сборке - C++ WinAPI
http://en.cppreference.com/w/cpp/language/static

Где-то дальше должно быть
Код: plaintext
1.
HWND CMyClass::myWindowHWND = NULL;
...
Рейтинг: 0 / 0
28.07.2017, 09:17
    #39496439
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объявление статического члена класса - ошибка при сборке - C++ WinAPI
Abejon,

Если ты объявишь myWindowHWND статической, то в каждом экземпляре класса это будет одна и та же сущность, то есть все классы будут разделять один экземпляр этой переменной. Сильно сомневаюсь, что так и задумано. Поэтому функция MyFunction должна иметь возможность получать адрес конкретного экземпляра класса CMyClass, а дальше уже обращаться к его индивидуальной переменной myWindowHWND этого экземпляра

Код: plaintext
1.
2.
3.
4.
public static void MyFunction(CMyClass* pMyClass)
{
    pMyClass->myWindowHWND;
}
...
Рейтинг: 0 / 0
28.07.2017, 10:28
    #39496500
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объявление статического члена класса - ошибка при сборке - C++ WinAPI
Cerebrum, нет. именно так и было задумано. Нельзя в static-функции использовать не static-члены класса.
...
Рейтинг: 0 / 0
28.07.2017, 10:29
    #39496501
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объявление статического члена класса - ошибка при сборке - C++ WinAPI
Dima T, да, спасибо, я нашёл ответ.

И лучше это объявление делать в .cpp файле, а не в .h - чтобы не было множественного включения в проект этого объявления.
...
Рейтинг: 0 / 0
28.07.2017, 10:33
    #39496506
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объявление статического члена класса - ошибка при сборке - C++ WinAPI
AbejonНельзя в static-функции использовать не static-члены класса.
Можно. Для этого нужно в функцию передать указатель на объект. Обычно так делается.
...
Рейтинг: 0 / 0
28.07.2017, 14:20
    #39496694
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объявление статического члена класса - ошибка при сборке - C++ WinAPI
AbejonВсё компилируетcя и собирается нормально. Но мне нужно использовать myWindowHWND в MyFunction. Для этого он должен быть статическим.


Нет, наоборот, для этого ты должен передавать в функцию ещё один параметр, HWND.
Либо ещё вариант -- сделать функцию НЕ статической.


Abejon Если пишу так

Код: plaintext
1.
private static HWND myWindowHWND


то получаю ошибку:

error LNK2001: неразрешенный внешний символ ""private: static struct HWND__ * CMyClass::myWindowHWND" (?mainHWND@CMyClass@@0PAUHWND__@@A)"

Смысл сообщения мне понятен, непонятно, как это связано с объявлением static?


Напрямую связано.
Объявление статической переменной класса не является определением, ты должен дать определение сам, руками, явным образом.
...
Рейтинг: 0 / 0
28.07.2017, 14:22
    #39496695
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объявление статического члена класса - ошибка при сборке - C++ WinAPI
AbejonЕсть такой код:

Код: plaintext
1.
2.
3.
4.
5.
class CMyClass
{
    ... 
    public static void MyFunction();
}





А с чего ты решил (или кто-то решил), что эта функция обязательно должна быть static в классе CMyClass?

Просто такое ощущение, что ты не знаешь совсем, что ты делаешь, и зачем.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Объявление статического члена класса - ошибка при сборке - C++ WinAPI / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]