Форум программистов, компьютерный форум CyberForum.ru

Error LNK2001: неразрешенный внешний символ - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 90, средняя оценка - 4.79
Skoi
16 / 16 / 1
Регистрация: 31.07.2009
Сообщений: 54
31.07.2009, 11:39     Error LNK2001: неразрешенный внешний символ #1
Помогите пожалуйста тупому нубу
Все неприятности начались после добавления дружественного класса -
C++
1
2
3
4
5
6
7
8
9
10
11
12
class KWnd 
{
    static HWND mhWnd;
    WNDCLASS wc;
    static HINSTANCE hInstance;
    static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    friend class wclass;
public:
    KWnd(HINSTANCE);
    void Initialize();
    WPARAM Run();
};
Пытаюсь получить доступ к приватным членам KWnd:

C++
1
2
3
4
5
HWND wclass::CreateStatic(int x, int y, int width, int height, LPWSTR label)
{
    return CreateWindowW(L"STATIC", label, WS_CHILD | WS_VISIBLE, x, y, 
        width, height, KWnd::mhWnd, 0, KWnd::hInstance, 0);
}
И вот тут, категорически не хочет линковаться -

C++
1
2
3
4
5
6
1>Компоновка...
1>kwnd.obj : error LNK2001: неразрешенный внешний символ ""private: static struct HWND__ * KWnd::mhWnd" (?mhWnd@KWnd@@0PAUHWND__@@A)"
1>wclass.obj : error LNK2001: неразрешенный внешний символ ""private: static struct HWND__ * KWnd::mhWnd" (?mhWnd@KWnd@@0PAUHWND__@@A)"
1>kwnd.obj : error LNK2001: неразрешенный внешний символ ""private: static struct HINSTANCE__ * KWnd::hInstance" (?hInstance@KWnd@@0PAUHINSTANCE__@@A)"
1>wclass.obj : error LNK2001: неразрешенный внешний символ ""private: static struct HINSTANCE__ * KWnd::hInstance" (?hInstance@KWnd@@0PAUHINSTANCE__@@A)"
1
Может кто подсказать где грабли?
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2009, 11:39     Error LNK2001: неразрешенный внешний символ
Посмотрите здесь:

C++ Error LNK2001: неразрешенный внешний символ
Классы и методы, error LNK2001: неразрешенный внешний символ C++
C++ Error LNK2001: неразрешенный внешний символ "_mainCRTStartup"
Ошибка: LNK2001: неразрешенный внешний символ C++
C++ Error LNK2001: неразрешенный внешний символ
LNK2001: неразрешенный внешний символ C++
C++ Error LNK2001: неразрешенный внешний символ
Не могу убрать ошибку: "error LNK2001: неразрешенный внешний символ" C++
C++ Ошибка: "error LNK2001: неразрешенный внешний символ" при реализации шаблонного синглтона
Error LNK2001: неразрешенный внешний символ C++
Error LNK2001: неразрешенный внешний символ C++
Error LNK2001: неразрешенный внешний символ "_main" C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
31.07.2009, 11:48     Error LNK2001: неразрешенный внешний символ #2
ответ найдешь здесь
волшебные слова - статическое поле
oxotnik
 Аватар для oxotnik
1585 / 1062 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
31.07.2009, 12:13     Error LNK2001: неразрешенный внешний символ #3
статические ф-ции класса не знают с каким экземпляром класса работать, т.е. по сути не владеют указателем this, посему нельзя смешивать статические и динамические данные.
Skoi
16 / 16 / 1
Регистрация: 31.07.2009
Сообщений: 54
08.08.2009, 12:51  [ТС]     Error LNK2001: неразрешенный внешний символ #4
2Охотник - Это очевидно)) Я канеш тупой, но не настолько. К тому же к вопросу это не имеет отношения.


Цитата Сообщение от Rififi Посмотреть сообщение
ответ найдешь здесь
волшебные слова - статическое поле
Спасибо, с этим разобрался. Но всё равно по другому переписал. Собственно пишу себе фреймворк для работы с формами, кнопками итп на винапи. В принципе, почти все сделал, осталось только события приделать. Кстати, по поводу событий. Первое что пришло в голову -
Event
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Event
{
public:
    static std::vector<void(*)()> *queue;
    static void Gateway()
    {
        std::vector<void(*)()>::iterator i;
        for (i=queue->begin(); i!=queue->end(); ++i) ((void (*)())*i)();
    }
    void operator+=(void(*CB)())
    {
        queue->push_back(CB);
    }
};


Это пока сырая заготовка. Как бэ юзер может подписаться на получение колбеков.
Ну а Gateway() вызывается из цикла сообщений.
Собственно вопрос, такая реализация сойдёт, или есть какие-то более модные методы реализации событий?
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
08.08.2009, 13:03     Error LNK2001: неразрешенный внешний символ #5
Собственно вопрос, такая реализация сойдёт,
сойдёт, если не обращать внимания что оно не может байндиться в функциям-членам класса

[/i]или есть какие-то более модные методы реализации событий?[/I]
Boost.Signals2 - наиболее приближённая модель к .NET (которую я считаю очень удачной)

PS. А вообще, ты только что изобрёл паттерн Observer/Mediator
Yandex
Объявления
08.08.2009, 13:03     Error LNK2001: неразрешенный внешний символ
Ответ Создать тему
Опции темы

Текущее время: 00:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru