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:
