• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem LNK2019 w Visual Studio 2019

Cloud VPS
0 głosów
218 wizyt
pytanie zadane 8 listopada 2022 w C i C++ przez XxThorusxX Użytkownik (500 p.)

Czołem. Przepisywałem kod z książki S. Prata "C++. Szkoła programowania", a po przepisaniu i próbie kompilacji wywala błąd w VS o kodzie LNK2019 i LNK1120. Jak to można poprawić? Poniżej wklejam kody źródłowe.

 

//Dziedziczenie wielokrotne
#include <iostream>
#include <cstring>
#include "workermi.h"

const int SIZE = 5;

int main()
{
	using std::cin;
	using std::cout;
	using std::endl;
	using std::strchr;

	Worker* lolas[SIZE];
	int ct;

	for (ct = 0; ct < SIZE; ct++)
	{
		char choice;
		cout << "Podaj kategorię pracownika:\n"
			<< "K: Kelner	P: Piosenkarz"
			<< "S: Śpiewający kelner		W: Wyjście\n";
		cin >> choice;

		while (strchr("kpsw", choice) == NULL)
		{
			cout << "Wpisz k, p, s lub w: ";
			cin >> choice;
		}

		if (choice == 'w')
			break;

		switch (choice)
		{
		case 'k':
			lolas[ct] = new Waiter;
			break;
		case 'p':
			lolas[ct] = new Singer;
			break;
		case 's':
			lolas[ct] = new SingingWaiter;
			break;
		}

		cin.get();
		lolas[ct]->Set();
	}

	cout << "\nLista pracownikow:\n";
	int i;

	for (i = 0; i < ct; i++)
	{
		cout << endl;
		lolas[i]->Show();
	}

	for (i = 0; i < ct; i++)
		delete lolas[i];
	cout << "Koniec.\n";
	
	return 0;
}
//Metody klas hierarchii Worker
#include "workermi.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

//Metody klasy Worker
Worker::~Worker() {}

//metody chronione
void Worker::Data() const
{
	cout << "Imie i nazwisko: " << fullName << endl;
	cout << "Numer identyfikacyjny: " << id << endl;
}

void Worker::Get()
{
	getline(cin, fullName);
	cout << "Podaj numer identyfikacyjny: ";
	cin >> id;
	while (cin.get() != '\n')
		continue;
}

//metody klasy Waiter
void Waiter::Set()
{
	cout << "Podaj imię i nazwisko kelnera: ";
	Worker::Get();
	Get();
}

void Waiter::Show() const
{
	cout << "Kategoria: kelner\n";
	Worker::Data();
	Data();
}

//metody chronione
void Waiter::Data() const
{
	cout << "Elegancja: " << panache << endl;
}

void Waiter::Get()
{
	cout << "Podaj poziom elegancji kelnera: ";
	cin >> panache;
	while (cin.get() != '\n')
		continue;
}

//metody klasy Singer
const char* Singer::pv[Singer::Vtypes] = { "inna", "alt", "kontralt", "sopran", "bas", "baryton", "tenor" };

void Singer::Set()
{
	cout << "Podaj imię i nazwisko piosenkarza: ";
	Worker::Get();
	Get();
}

void Singer::Show() const
{
	cout << "Kategoria: piosenkarz\n";
	Worker::Data();
	Data();
}

//metody chronione
void Singer::Data() const
{
	cout << "Skala głosu: " << pv[voice] << endl;
}

void Singer::Get()
{
	cout << "Podaj numer dla skali głosu piosenkarza:\n";
	int i;

	for (i = 0; i < Vtypes; i++)
	{
		cout << i << ": " << pv[i] << "	";
		if (i % 4 == 3)
			cout << endl;
	}
	if (i % 4 != 0)
		cout << '\n';
	cin >> voice;
	while (cin.get() != '\n')
		continue;
}

//metody klasy SingingWaiter
void SingingWaiter::Data() const
{
	Singer::Data();
	Waiter::Data();
}

void SingingWaiter::Get()
{
	Waiter::Get();
	Singer::Get();
}

void SingingWaiter::Set()
{
	cout << "Podaj imię i nazwisko śpiewającego kelnera: ";
	Worker::Get();
	Get();
}

void SingingWaiter::Show() const
{
	cout << "Kategoria: śpiewający kelner\n";
	Worker::Data();
	Data();
}
//Hierarchia klas z użyciem dziedziczenia wielokrotnego
#ifndef WORKERMI_H_
#define WORKERMI_H_

#include <string>

class Worker //abstrakcyjna klasa bazowa
{
private:
	std::string fullName;
	long id;
protected:
	virtual void Data() const;
	virtual void Get();
public:
	Worker() : fullName("brak"), id(0L) {}
	Worker(const std::string& s, long n) : fullName(s), id(n) {}
	virtual ~Worker() = 0;  //funkcja czysto wirtualna
	virtual void Set() = 0;
	virtual void Show() const = 0;
};

class Waiter : virtual public Worker
{
private:
	int panache;
protected:
	void Data() const;
	void Get();
public:
	Waiter() : Worker(), panache(0) {}
	Waiter(const std::string& s, long n, int p = 0) : Worker(s, n), panache(p) {}
	Waiter(const Worker& wk, int p = 0) : Worker(wk), panache(p) {}
	void Set();
	void Show() const;
};

class Singer : virtual public Worker
{
protected:
	enum {inna, alt, kontralt, sopran, bas, baryton, tenor};
	enum {Vtypes = 7};
	void Data() const;
	void Get();
private:
	static const char* pv[Vtypes];  //odpowiednik skali głosu w postaci ciągu znaków
	int voice;
public:
	Singer() : Worker(), voice(inna) {}
	Singer(const std::string& s, long n, int v = inna) : Worker(s, n), voice(v) {}
	Singer(const Worker& wk, int v = inna) : Worker(wk), voice(v) {}
	void Set();
	void Show() const;
};

//Dziedziczenie wielokrotne
class SingingWaiter : public Singer, public Waiter
{
protected:
	void Data() const;
	void Get();
public:
	SingingWaiter();
	SingingWaiter(const std::string& s, long n, int p = 0, int v = inna) : Worker(s, n), Waiter(s, n, p), Singer(s, n, v) {}
	SingingWaiter(const Worker& wk, int p = 0, int v = inna) : Worker(wk), Waiter(wk, p), Singer(wk, v) {}
	SingingWaiter(const Waiter& wt, int v = inna) : Worker(wt), Waiter(wt), Singer(wt, v) {}
	SingingWaiter(const Singer& wt, int p = 0) : Worker(wt), Waiter(wt, p), Singer(wt) {}
	void Set();
	void Show() const;
};
#endif

 

Błędy:

1 odpowiedź

0 głosów
odpowiedź 8 listopada 2022 przez XxThorusxX Użytkownik (500 p.)
Problem rozwiązany. Zapomniałem o definicji konstruktora domyślnego klasy SingingWaiter

Podobne pytania

0 głosów
0 odpowiedzi 174 wizyt
+1 głos
1 odpowiedź 390 wizyt
0 głosów
0 odpowiedzi 632 wizyt
pytanie zadane 23 listopada 2020 w C# przez Bar Tek Nowicjusz (120 p.)

93,485 zapytań

142,417 odpowiedzi

322,765 komentarzy

62,898 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...