40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
1

проблема со статическим std::map

04.10.2021, 00:59. Показов 1056. Ответов 5

Author24 — интернет-сервис помощи студентам
при сборке этот код выдаёт ошибку. суть такая, мне надо иметь пару (хендл окна + указатель на класс), т.к в winProc нужно определять по этой паре нужное окно и обрабатывать его события. тут у человека всё работает именно оттуда и копипащу, но чет не взлетает у меня. Уважаемые, прошу помощи! (или посоветуйте как обойти это)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class window
        {
        private:
            HWND m_hwnd;
            MSG m_messages;
            WNDCLASSEX m_wincl;
            
            static std::map<HWND, window*> s_RegisteredWindows;
 
 
        private:
            void WinInit(HINSTANCE hThisInstance);          
            static LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
        };

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 void window::WinInit(HINSTANCE hThisInstance)
        {
           
            m_wincl.hInstance = hThisInstance;
            m_wincl.lpszClassName = config.m_winClassName;
            m_wincl.lpfnWndProc = WindowProcedure;
            m_wincl.style = config.wcl_style;
            m_wincl.cbSize = sizeof(WNDCLASSEX);
 
            m_wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
            m_wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
            m_wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
            m_wincl.lpszMenuName = NULL;                 
            m_wincl.cbClsExtra = 0;                      
            m_wincl.cbWndExtra = 0;                     
            m_wincl.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
 
            RegisterClassEx(&m_wincl);
 
            m_hwnd = CreateWindowEx(
                0,                   
                config.m_winClassName,        
                config.m_winAppName,     
                config.wnd_style, 
                config.posX,      
                config.posY,       
                config.width,                
                config.height,                
                NULL,       
                NULL,               
                hThisInstance,     
                NULL);
 
            
            s_RegisteredWindows[m_hwnd] = this; // проблема
            
           
            ShowWindow(m_hwnd, SW_SHOW);
        }
выдает вот такую ошибку
Код
Ошибка	LNK2001	неразрешенный внешний символ ""private: static class std::map<struct HWND__ *,class nx::platform::window *,struct std::less<struct HWND__ *>,class std::allocator<struct std::pair<struct HWND__ * const,class nx::platform::window *> > > nx::platform::window::s_RegisteredWindows" (?s_RegisteredWindows@window@platform@nx@@0V?$map@PAUHWND__@@PAVwindow@platform@nx@@U?$less@PAUHWND__@@@std@@V?$allocator@U?$pair@QAUHWND__@@PAVwindow@platform@nx@@@std@@@6@@std@@A)"	mini_app	F:\mini_app\window.obj	1
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2021, 00:59
Ответы с готовыми решениями:

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы...

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa;...

Очистка map и перевернутого std::map c std::greater
Написала я программу, которая заполняет два контейнера map. a,b. вывод программы такой 11 a:...

Стоит ли очищать в деструкторе std::map , std::vecotor?
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора, которые по ходу...

std::map, std::vector и порядок обхода коллекции
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения в map или вектор, то...

5
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
04.10.2021, 01:10 2
Цитата Сообщение от Крюгер Посмотреть сообщение
Ошибка LNK2001
Компилятор говорит, что поле объявлено, но не определено. Где у вас в коде определение этого статического поля???

Цитата Сообщение от Крюгер Посмотреть сообщение
тут у человека всё работает именно оттуда и копипащу
"тут у человека" огрызки кода, а не полный код.
0
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
04.10.2021, 07:18  [ТС] 3
TheCalligrapher, возможно правильнее было сразу ссылку на репозиторий вставить, вот.
Покажите пожалуйста, как сделать правильно. Я как-то до сих пор не сталкивался с использованием статического контейнера в классе
0
-95 / 92 / 18
Регистрация: 10.03.2017
Сообщений: 306
04.10.2021, 07:47 4
Статические члены, обьявленные в классе, за исключением некоторых случаев нужно ещё и определять.

Например, есть обьявление в заголовочном файле
C++
1
2
3
4
5
6
7
8
9
class Mapper
{
    static std::map<int, string> m;
public:
    void add(int i, string s)
    {
        m[i] = s;
    }
};
Чтобы это работало, в файле реализации нужно дополнительно определить m
C++
1
std::map<int, string> Mapper::m;
Добавлено через 1 минуту
В вашем случае это будет выглядеть примерно так:
C++
1
std::map<HWND, window*> window::s_RegisteredWindows;
1
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
04.10.2021, 08:28 5
Цитата Сообщение от Крюгер Посмотреть сообщение
возможно правильнее было сразу ссылку на репозиторий вставить
Ну так там, в этом самом "репозитории" в файле window.cpp

https://bitbucket.org/dvsav/op... p#lines-22

находится определение этого статического члена. Его-то вы и не "скопипастили".
1
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 460
Записей в блоге: 7
04.10.2021, 16:25  [ТС] 6
zorggish, TheCalligrapher, спасибо за подсказку, вы очень помогли)
0
04.10.2021, 16:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2021, 16:25
Помогаю со студенческими работами здесь

Std::unordered_multimap<std::string, int> map
Приветствую. Как можно получить только &quot;уникальный&quot; ключ в контейнере? ...

std::map или std::vector?
Здравствуйте. У меня есть 3 класса: клиенты банка, клиент, счёт. У класса Клиенты лишь одно поле...

Потокобезопасность std::map::end, std::list::end
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) //...

std::map
мне нужно записать в переменную результат выполнения команды tmp.emplace(2.344, 1). Как вывести, на...

Проблема со статическим классом
Всем привет, у меня есть статический класс со статическими методами в нем: static class Enigma {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru