Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Две ошибки error LNK2019 и fatal error LNK1120 во время компоновки  [new]
Oleg_Lin
Member

Откуда:
Сообщений: 11
Привет всем, при написании кода столкнулся с ошибками времени компоновки:
1>Source.obj : error LNK2019: unresolved external symbol "int __cdecl callsWord_inference(int,int)" (?callsWord_inference@@YAHHH@Z) referenced in function "int __cdecl menu(int)" (?menu@@YAHH@Z)
и
1>F:\Project\English_Random_2.0\x64\Debug\English_Random_2.0.exe : fatal error LNK1120: 1 unresolved externals
Из-за чего возникают примерно нашёл но исправить не смог. /SUBSYSTEM:CONSOLE стоит в настройках.
Программа ещё не готова и из-за ошибок и запутанности слил все файлы в один файл чтобы исправить ошибки, но осталась ошибки компоновки. Потом назад разобью на файлы и продолжу развивать её после решения этих проблем.
Тапками сильно но бросайте, т.к я не опытен ещё в c++ и ещё учусь.

Картинка с другого сайта.
Вот код:
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <vector>

using namespace std;
void pause();
int callsWord_inference(int d, int a);
int menu(int d);

class word_bases
{
private:
	vector<string> rus;
	int q;
	vector<string> eng;
	int w;

public:
	word_bases()
	{
		ifstream lan("Russian.txt");
		for (q = 0; lan && lan >> rus[q]; q++)
			;
		lan.close();
		ifstream lan2("English.txt");
		for (w = 0; lan2 && lan2 >> eng[w]; w++)
			;
		lan2.close();
	}

	int word_inference(int a)
	{
		if (a == 1)
		{
			cout << "***Начинаем, russian!\n";
			cout << "\n";
			cout << "\n";

			int z{};
			for (; z == q; z++)
			{
				cout << rus[z] << endl;
				pause();
			}
			menu(1);

		}
		else if (a == 2)
		{
			cout << "***Начинаем, english!\n";
			cout << "\n";
			cout << "\n";

			int x{};
			for (; x == w; x++)
			{
				cout << eng[x] << endl;
				pause();
			}

			menu(1);
		}
		else if (a == 3)
		{
			cout << "***Выключаю. \n";
			exit(1);
		}
		else if (a != 1 && 2 && 3)
		{
			cout << "***Вы ввели не то число, попробуйте заново! \n";
			menu(1);
		}
		return 0;
	}

	//Чтобы программа не закрывалась.
	int callsWord_inference(int d, int a)
	{
		switch (d)
		{
		case 1:
			word_inference(a);
			return 0;
			break;
		default:
			return a;
		}
	}
	friend void pause();
	friend int menu(int d);
};

//Меню выбора и обработка некорректного пользовательского ввода.
int menu(int d)
{

	while (true)
	{
		cout << "***Какую сторону вы хотите учить? \n" << "***Для russian нажмите 1, для english 2, ";
		cout << "для выхода нажмите 3.\n";
		int a;
		cin >> a;

		if (cin.fail())
		{
			cout << "***Вы ввели непонятный символ, попробуйте заново! \n";
			cin.clear();
			cin.ignore(32767, '\n');
		}
		else
			return callsWord_inference(d, a);
	}
}

//Пауза после вывода на экран слова (продолжить, вернутся в меню и обработка некорректного пользовательского кода).
void pause()
{
	int b(0);
	while (b != 1)
	{
		int a(0);
		cout << "***P.s: для выхода нажмите 3, для продолжения любую другую цифру, потом enter.\n";
		cout << "\n";
		cin >> a;
		if (cin.fail())
		{
			cout << "***Вы ввели не цифру!, попробуйте заново! \n";
			cin.clear();
			cin.ignore(32767, '\n');
			b = 0;
		}
		else if (a == 3)
		{
			cout << "***Возвращаемся к меню.\n";
			menu(1);
			b = 1;
		}
		else if (a >= 0 && a <= 10)
			b = 1;
		else if (a > 10)
		{
			cout << "Введённое чесло больше 10! Оно не подходит! \n";
			b = 0;
		}
		else if (a < 0)
		{
			cout << "Введённое чесло меньше 0! Оно не подходит! \n";
			b = 0;
		}
	}
}

//Запуск и русифицирование программы.
int main()
{
	setlocale(LC_CTYPE, "rus");
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	word_bases lang;
	lang.word_inference(menu(0));
	return 0;
}
14 сен 19, 13:58    [21970886]     Ответить | Цитировать Сообщить модератору
 Re: Две ошибки error LNK2019 и fatal error LNK1120 во время компоновки  [new]
Cerebrum
Member

Откуда: Омикрон Персей 8
Сообщений: 7894
Зачем friend'ить внешние функции (menu/pause) в классе word_bases, ведь функции-члены, к которым они обращаются все равно public?

Что мешает передать в menu экземпляр класса word_bases по ссылке и дернуть изнутри?

int menu(int d, word_bases& wb)
{

	while (true)
	{
		cout << "***Какую сторону вы хотите учить? \n" << "***Для russian нажмите 1, для english 2, ";
		cout << "для выхода нажмите 3.\n";
		int a;
		cin >> a;

		if (cin.fail())
		{
			cout << "***Вы ввели непонятный символ, попробуйте заново! \n";
			cin.clear();
			cin.ignore(32767, '\n');
		}
		else
			return wb.callsWord_inference(d, a);
	}
}

friend'овость из класса удалить, но сначала добавить forward declaration для класса:
using namespace std;

class word_bases;

void pause();
int callsWord_inference(int d, int a);
int menu(int d, word_bases& wb);

в word_inference нужно исправить вызов menu тоже:
menu(1, *this);


Короче, тут налицо архитектурный Адъ и Израиль
14 сен 19, 15:27    [21970926]     Ответить | Цитировать Сообщить модератору
 Re: Две ошибки error LNK2019 и fatal error LNK1120 во время компоновки  [new]
Oleg_Lin
Member

Откуда:
Сообщений: 11
Cerebrum, Спасибо, теперь знаю какие темы мне нужно особенно повторить и изучить, и понял то, что сначала лучшую выучить теорию, прежде чем продолжить кодить.

"Зачем friend'ить внешние функции (menu/pause) в классе word_bases, ведь функции-члены, к которым они обращаются все равно public?" - не подумал.

"Что мешает передать в menu экземпляр класса word_bases по ссылке и дернуть изнутри?" - вылетели из головы.

А про указатель *this краем глаза читал и мало.

Одним словом незнание теории и отсутствие опыта.
15 сен 19, 06:40    [21971060]     Ответить | Цитировать Сообщить модератору
 Re: Две ошибки error LNK2019 и fatal error LNK1120 во время компоновки  [new]
egorych
Member

Откуда: и зачем;
Сообщений: 4765
Oleg_Lin
Привет всем, при написании кода столкнулся с ошибками времени компоновки:
1>Source.obj : error LNK2019: unresolved external symbol "int __cdecl callsWord_inference(int,int)" (?callsWord_inference@@YAHHH@Z) referenced in function "int __cdecl menu(int)" (?menu@@YAHH@Z)
и
1>F:\Project\English_Random_2.0\x64\Debug\English_Random_2.0.exe : fatal error LNK1120: 1 unresolved externals
нет тела функции callsWord_inference(), вот линкер и ругается
15 сен 19, 11:44    [21971099]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить