Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55

Unresolved external symbol

12.12.2016, 21:38. Показов 893. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читаю книгу по программированию в MFC, хоть она и 13летней давности
В общем дошол до создания окна через Resource и создание класса для окна.
При линковке выдает следующие 2 ошибки:
Кликните здесь для просмотра всего текста

Error 1 error LNK2019: unresolved external symbol "public: __thiscall CMyDialog::CMyDialog(unsigned int,class CWnd *)" (??0CMyDialog@@QAE@IPAVCWnd@@@Z) referenced in function "public: void __thiscall CMainWnd::OnRButtonDblClk(unsigned int,class CPoint)" (?OnRButtonDblClk@CMainWnd@@QAEXIVCPoint @@@Z) E:\Visual Studio 2013\Projects\MFCDemo\ConsoleApplication 1\Main.obj Создание окна в Win32 Application

Кликните здесь для просмотра всего текста

Error 2 error LNK1120: 1 unresolved externals E:\Visual Studio 2013\Projects\MFCDemo\Debug\Создание окна в Win32 Application.exe Создание окна в Win32 Application


Все что я смог выяснить, это то что ошибка рождается в конструкторе класса данного окна,
самый первый класс сверху.
Не обращайте внимание на коменты в коде, писал для себя.
Вот код:
Кликните здесь для просмотра всего текста

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#include <afxwin.h>     // MFC Основные и стандартные компоненты
#include <afxext.h>     //Расширения для MFC
#include "resource.h"   //Здесь хранятся идентификаторы
 
#define IDC_MYBUTTON 100    //Идентификатор кнопки
#define IDC_MYEDIT 102      //Идентификатор поля редактирования
#define IDC_LIST1  106
 
//Создаем класс для нового окна
class CMyDialog : public CDialog
{
public:
    CMyDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);
    virtual BOOL OnInitDialog();
    virtual void OnOk();
    CString GetString();
private:
    CListBox *cListBox;
    CString cDate;
};
 
CString CMyDialog::GetString()
{
    return cDate;
}
 
void CMyDialog::OnOk()
{
    if (cListBox->GetCurSel() == LB_ERR)
    {
        AfxMessageBox(L"Select Item List Box");
    }
    else
    {
        CString buffer;
        cListBox->GetText(cListBox->GetCurSel(), buffer);
        /*cDate = buffer;*/
        CDialog::OnOK();
    }
}
 
BOOL CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    CenterWindow();
    CRect rect(10, 10, 100, 100);
    cListBox = new CListBox();
    cListBox->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | LBS_NOTIFY | WS_VSCROLL | WS_BORDER, rect, this, IDC_LIST1);
    cListBox->AddString(L"God");
    cListBox->AddString(L"Bad");
    cListBox->AddString(L"VOID");
    return TRUE;
}
 
//Создаем свой CPainDC
class CMyPaintDC: public CPaintDC
{
public:
    CMyPaintDC(CWnd* pWnd);                 //Конструктор по умолчанию
    void DrawCross(int iPosX, int iPosY);   //Метод рисующий крест
};
 
CMyPaintDC::CMyPaintDC(CWnd* pWnd) : CPaintDC(pWnd) {}  //Реализация конструктора по умолчанию, передаем параметры конструктору родительского класса
 
void CMyPaintDC::DrawCross(int iPosX, int iPosY)    //Реализация метода рисующего крест
{
    MoveTo(iPosX - 50, iPosY);
    LineTo(iPosX + 50, iPosY);
    MoveTo(iPosX, iPosY - 50);
    LineTo(iPosX, iPosY + 50);
}
 
class CMyButton : public CButton
{
public:
    afx_msg void OnLButtonDblClk(UINT, CPoint);
    afx_msg void OnRButtonDblClk(UINT, CPoint);
private:
    DECLARE_MESSAGE_MAP();  //Таблица откликов кнопки
};
 
BEGIN_MESSAGE_MAP(CMyButton, CButton)
    ON_WM_LBUTTONDBLCLK()
    ON_WM_RBUTTONDBLCLK()
    END_MESSAGE_MAP()
 
    void CMyButton::OnLButtonDblClk(UINT, CPoint)
    {
        //Данная соманда вызывается от родительского класса CWnd данного обьекта
        //Если вызывать не от обьекта, то функция принимает 6 параметров, 4 из которых щас передаются в функцию CRect
        //Первым параметром будет дискриптор окна(обьекта) который требуется перерисовать
        MoveWindow(CRect(120, 100, 220, 150), TRUE);    //Перерисовывает текущий обьект в указанные координаты
    }
 
    void CMyButton::OnRButtonDblClk(UINT, CPoint)
    {
        MoveWindow(CRect(120, 10, 220, 50), TRUE);  //Перерисовывает текущий обьект в указанные координаты   
    }
    
 
class CMainWnd : public CFrameWnd
{
public:
    CMainWnd(); // Конструктор по умочанию
    afx_msg void OnLButtonDblClk(UINT, CPoint); //Виртуальная процедура ответа на левую кнопку
    afx_msg void OnRButtonDblClk(UINT, CPoint); //Виртуальная процедура ответа на правую кнопку
    afx_msg void OnKeyDown(UINT, UINT, UINT);   //Виртуаьная процедура ответа на клавишу
    //afx_msg - можно воспринимать как аналог virtual
    int OnCreate(LPCREATESTRUCT lpCreateStruct); //Данная функция вызывается при создании окна обьекта данного класса, не является виртуальной
    //Данную функцию необходимо обьявлять в классе в котором и будем обрабатывать и в котором есть обработчик событий
    void MenuExit();            //Процедура реакции на нажатие Exit в меню File
    afx_msg void OnPaint();     //Переопределяем функцию рисования в окне
    
private:
    CStatusBar m_wndStatusBar;  //Панель состояния
    //Идентификатор обьекта надписи явно необьявлен в начале в #define, он просто задан по умолчанию как 0xffff
    CStatic* MyStatic;  //Указатель на обьект надпись
    CMyButton* MyButton;    //Указатель на обьект кнопка
    CEdit* MyEdit;      //Указатель на обьект поле редактирования
    CMenu m_wndMenu;    //Меню
 
    //Добавление данного макроса в класс говорит о том, что данный класс будет реагировать на события
    DECLARE_MESSAGE_MAP();
};
 
//Если класс реагирует на события, то необходимо описать таблицу откликов на них, описание событий начинается с ON_WM_message - это события Windows
//таблица откликов на сообщения
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)  //Первый параметр "Класс реагирующий на событие", второй параметр "Класс родитель реагирующего на события"
    //Класс родителя необходим для обработки стандартных сообщений, даже если вы их явно не обрабатываете, например закрыть приложение.
    ON_WM_LBUTTONDBLCLK()               //реакция на нажатие левой кнопки мыши
    ON_WM_RBUTTONDBLCLK()               //реакция на нажатие правой кнопки мыши
    ON_WM_KEYDOWN()                     //реакция на нажатие клавиши
    ON_WM_CREATE()                      //Событие создания окна
    //Обработка реакции на выбор Exit в меню File
    ON_COMMAND(ID_FILE_EXIT, MenuExit)  //Первым параметром является идентификатор обьекта, вторым функция которая будет выполнятся
                                        //функция должна пренадлежать классу, чьей эта таблица откликов является
                                        //Макрос ON_COMMAND предназначен для обработки команд меню
    ON_WM_PAINT()
END_MESSAGE_MAP()
 
void CMainWnd::OnPaint()
{
    //CPaintDC dc(this);                                //Получить контекст устройства
    //dc.TextOutW(200, 200, L"Привет MFC Программа");    //Написать в нем привет
    //dc.MoveTo(300, 300);                          //Начать рисовать линию
    //dc.LineTo(600, 105);                          //И продолжить рисовать линию                       
    //dc.SetPixel(200, 200, RGB(255, 0, 0));            //Красный пиксель, над буквой "П" слева, чем выше разрешение экрана тем меньше пиксель
    //dc.Arc(200, 200, 100, 100, 400, 400, 10, 10); //Дуга окружности
    //dc.Chord(200, 200, 100, 100, 400, 400, 10, 10); //Замкнутая дуга (перекрывает дугу описанную выше)
    //dc.Ellipse(200, 200, 50, 250);                    //Элипс
 
    //dc.MoveTo(350, 350);      //Линия начало
    //dc.LineTo(400, 400);      //Линия конец
 
    CMyPaintDC dc(this);
    //Создаем перо
    CPen MyPen(PS_DASHDOT, 1, RGB(0, 255, 0));  //PS_DASHDOT - пунктир, 1 - толщина линии, RGB - цвет линии
    dc.SelectObject(&MyPen);    //Говорим что нужно рисовать пером
    for (int x = 1; x < 400; x = x + 100)   //Нарисуем 4 креста по диагонали
        dc.DrawCross(100 + x, 100 + x);
}
 
void CMainWnd::MenuExit()
{
    DestroyWindow();    //Уничтожить окно, возвращает значение типа BOOL, окно не всегда можно уничтожить
}
 
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)  //Если -1 то окно не создано
        return -1;
    //Статическое включение статусбара при создании рамки окна
    m_wndStatusBar.Create(this);    //В качестве параметра принимает указатель на обьект(куда вставлять, кто будет владеть создаваемым обьектом)
 
    //Загрузить меню из файла ресурса, в качестве параметра принимает идентификатор (уже созданного внешнего вида меню)
    m_wndMenu.LoadMenuW(IDR_MENU);  //LoadMenuW возвращает значение типа BOOL указывающее на успех операции
    SetMenu(&m_wndMenu);            //Установить меню, в качестве параметра принимает адресс класса типа CMenu
    return 0;
}
 
CMainWnd::CMainWnd()
{
    Create(NULL, L"Окно", WS_OVERLAPPEDWINDOW, rectDefault,
        NULL, NULL); // Создать окно программы
    //Создаем обьекты при создании класса
    MyStatic = new CStatic();   //Обьект надпись(выделяем под него память)
    //Чтобы писать латинскими буквами, необходимо перед полем сообщение ставить "L"
    MyStatic->Create(L"Мое сообщение", WS_CHILD | WS_VISIBLE | SS_CENTER, CRect(10, 10, 100, 50), this);    //Создаем обьект надпись
    MyButton = new CMyButton(); //Обьект кнопка(выделяем под него память)
    MyButton->Create(L"Кнопарь", WS_CHILD | WS_VISIBLE | SS_CENTER, CRect(120, 10, 220, 50), this, IDC_MYBUTTON);    //Создаем обьект кнопка
    MyEdit = new CEdit();       //Обьект поле редактирования(выделяем под него память)
    MyEdit->Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(240, 10, 340, 50), this, IDC_MYEDIT);   //Создаем обьект поле редактирования
    //Функция Create используется очень часто и есть у многих обьектов. Обычно она требует:
    //1. Строку для имени или надписи.
    //2. Стиль.
    //3. Размеры и положение.
    //4. Куда вставлять.
    //5. Идентификатор
    //this - означает что вставлять туда где находишся(мы в классе рамки окна)
}
 
void CMainWnd::OnKeyDown(UINT, UINT, UINT)
{
    AfxMessageBox(L" Key Button Down ");
}
 
void CMainWnd::OnRButtonDblClk(UINT, CPoint)
{
    CMyDialog about(IDD_DIALOG1);
    if (about.DoModal() == IDOK)
        AfxMessageBox(about.GetString());
    //CDialog about(IDD_DIALOG_ABOUT);
    //if (about.DoModal() == IDOK) AfxMessageBox(L"Ок");  //DoModal возвращает код нажатой клавищи(что было нажато перед закрытием окна)
    //else AfxMessageBox(L"Отмена");
}
 
void CMainWnd::OnLButtonDblClk(UINT, CPoint)
{
    //Создаем новое меню через Add -> Resourse -> Menu
    //В новом меню также создаем Файл -> Выход, идентификатор обьекту "Выход" присваиваем такойже как и у старого меню "IDR_FILE_EXIT"
    //Это чтобы не переписывать таблицу откликов
    m_wndMenu.DestroyMenu();            //Уничтожаем старое меню(текущее меню)
    m_wndMenu.LoadMenuW(IDR_MENU1);     //Читаем новое меню
    SetMenu(&m_wndMenu);                //Устанавливаем меню
    /*На эту тему можно фантазировать.Например, меню на английском, немецком, французком на выбор ? Или меню, которое постоянно изменяется при разных условиях.Или конкретное меню под конкретное рабочее место, под паролем на основании меню, в котором есть всё ?*/
}
 
class CMyApp : public CWinApp
{
 
public:
    CMyApp(); // конструктор по умолчанию
    virtual BOOL InitInstance(); // стандартная инициализация
};
 
CMyApp::CMyApp() // конструктор главного класса приложения
{}
 
BOOL CMyApp::InitInstance() // стандартная инициализация
{
    m_pMainWnd = new CMainWnd();    //Создать ообьект производный от CMainWnd и присвоить указателю m_pMainWnd фдресс этого обьекта
    ASSERT(m_pMainWnd);         //Проверить указатель на корректность
    m_pMainWnd->ShowWindow(SW_SHOW); // Показать окно
    m_pMainWnd->UpdateWindow(); // Обновить окно
    return TRUE; // Вернуть что все нормально 
};
 
CMyApp theApp; // запуск приложения
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2016, 21:38
Ответы с готовыми решениями:

Unresolved external symbol, unresolved token
Всем привет. У меня тут такое дело: // learncpp.cpp : main project file. #include &quot;stdafx.h&quot; int main() { const int...

Unresolved external symbol
Я понимаю что ошибка LNK2019 обычно означает что есть объявление функции, но нет ее тела. В моем случае у меня как то через раз это...

Unresolved external symbol
В общем, стандартная ошибка линкера: 5&gt;lib1.lib(a.obj) : error LNK2001: неразрешенный внешний символ &quot;_lol&quot; В a.c...

3
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,237
12.12.2016, 21:41
Цитата Сообщение от Chronid Посмотреть сообщение
CMyDialog(unsigned int,class CWnd *)
В классе CMyDialog такой конструктор объявлен, но код для него написать Вы забыли.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6792 / 1818
Регистрация: 18.10.2014
Сообщений: 17,187
12.12.2016, 22:11
Цитата Сообщение от Chronid Посмотреть сообщение
Все что я смог выяснить, это то что ошибка рождается в конструкторе класса данного окна,
Что значит "рождается в конструкторе"? Компилятор (линкер) вам говорит открытым текстом, что в строке 13 вы пообещали написать такой конструктор, но не написали его. Где сам конструктор-то?

Поэтому "рождаться в конструкторе" ошибка никак не может. Ошибка в том, что определения конструктора просто нет.
1
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
12.12.2016, 22:25  [ТС]
Вот это я лоханулся...
Я точно помню что писал его, что в нем пустой указатель передается в конструктор родительского класса.
Похоже какимто макаром случайно удалил конструктор...

Добавлено через 6 минут
Всем спасибо и + в карму
Вот этого нехватало, как написал я выше, я както удалил его:
C++
1
CMyDialog::CMyDialog(UINT nIDTemplate, CWnd* pParentWnd) : CDialog(nIDTemplate, pParentWnd) {}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2016, 22:25
Помогаю со студенческими работами здесь

Unresolved external symbol
Чем больше я сталкиваюсь с этой ошибкой и чем больше решаю её, тем непонятнее она становится. Скопировал код из одного проекта VS в другой,...

Unresolved external symbol
policy.h #ifndef POLICY_H #define POLICY_H #include &lt;forward_list&gt; #include &quot;vector.h&quot; struct PolicyVector ...

unresolved external symbol
Доброе время собственно не понимаю почему компилатор ругается. Файлы : main.cpp #include &quot;Header.h&quot; #include...

Unresolved external symbol
Error 1 error LNK2001: unresolved external symbol &quot;public: void __thiscall Lab3::HashTable::addElement(char *,char *,float)&quot;...

unresolved external symbol
Добрый день. :) Стоит задача разработать шаблонный класс комплексных чисел. Одним из пунктов является решение квадратного уравнения с...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru