Witam!!
Mam do napisania projekt.
Projekt musi spełniać następujące warunki:
- Jego implementacja powinna wymagać zastosowania hierarchii klas o conajmniej trzech poziomach.
- Hierarchia klas powinna zawierać klasy abstrakcyjne.
- W implementacji należy zastosować polimorficzne wywołania operacji zdefiniowanych w nadrzędnej klasie abstrakcyjnej.
- W zadaniu należy posłużyć się iteracyjnym przetwarzaniem obiektów z zastosowaniem klas biblioteki standardowej.
Treść projektu jest taka:
Napisać program - obiektową bazę danych o zbiorach nośników audiowizualnych. Założyć, że zbiory zawierają kasety audio, kasety wideo, płyty. Należy umożliwić wprowadzanie danych, zapisywanie i odczytywanie z dysku.
WSKAZÓWKI i UWAGI:
-każda grupa nośników powinna być reprezentowana przez odpowiednią klasę zapewniającą takie usługi jak edycja danych związanych z obiektem danej klasy, zapis i odczytywanie.
-wszystkie klasy powinny zostać wyprowadzone ze wspólnej klasy bazowej Pozycja.
-w pamięci utworzyć strukturę dynamiczną - listę zawierająca elementy typu Pozycja.
Mój problem polega na tym, że w trakcie kompilacji w VS 2010 Pro natrafiłem na pewien błąd, którego nie mam pojęcia jak go rozwiązać.
Wrzucę tu mój kod źródłowy z komentarzem // tej linijki dotyczy błąd
, aby zaznaczyć której linijki dotyczy błąd, którego komunikat z logu kompilacji zamieszczę poniżej.
Kod źródłowy
// Projekt z PK - katalog płyt i kaset AV.cpp : Defines the entry point for the console application.
#include "stdafx.h"
using namespace std;
/* poziom klasy bazowej Pozycja - poziom pierwszy */
class IPozycja{
public:
int idp;
virtual ~IPozycja();
virtual void WyswietlInfo()=0;
/*
virtual void WyswietlInfo(){
cout << "Informacje o pozycji:" << endl;
cout << "Id pozycji:" << idp << endl;
}
*/
};
/* poziom klasy pochodnej - abstrakcja nosnika - poziom drugi */
class IPlyta : public IPozycja{
public:
int ccn;
virtual ~IPlyta();
virtual void WyswietlInfo()=0;
/*
virtual void WyswietlInfo(){
cout << "Informacje o pozycji:" << endl;
cout << "Id pozycji:" << idp << endl;
cout << "Całkowity czas nagrania:" << ccn << endl;
}
*/
};
class IKaseta : public IPozycja{
public:
int ccn;
int pcn;
virtual ~IKaseta();
virtual void WyswietlInfo()=0;
/*
virtual void WyswietlInfo(){
cout << "Informacje o pozycji:" << endl;
cout << "Id pozycji:" << idp << endl;
cout << "Całkowity czas nagrania:" << ccn << endl;
cout << "Pozostały czas nagrywania:" << pcn << endl;
}
*/
};
/* poziom klasy pochodnej - abstrakcja danych nośnika - poziom trzeci */
class CPA : public IPlyta{
public:
string w;
string a;
string g;
int ilu;
CPA(int id, string wyk, string alb, string gat, int iu, int ccnag){
idp=id;
w=wyk;
a=alb;
g=gat;
ilu=iu;
ccn=ccnag;
};
~CPA();
void WyswietlInfo(){
cout << "Informacje o pozycji:" << endl;
cout << "Id pozycji:" << idp << endl;
cout << "Wykonawca:" << w << endl;
cout << "Album:" << a << endl;
cout << "Gatunek:" << g << endl;
cout << "Ilość utworów:" << ilu << endl;
cout << "Całkowity czas nagrania:" << ccn << endl;
}
};
class CPV : public IPlyta{
public:
string tf;
string g;
CPV(int id, string tyt, string gat, int ccnag){
idp=id;
tf=tyt;
g=gat;
ccn=ccnag;
};
~CPV();
void WyswietlInfo(){
cout << "Informacje o pozycji:" << endl;
cout << "Id pozycji:" << idp << endl;
cout << "Tytuł filmu:" << tf << endl;
cout << "Gatunek filmu:" << g << endl;
cout << "Całkowity czas nagrania:" << ccn << endl;
}
};
class CKA : public IKaseta{
public:
string w;
string a;
string g;
int ilu;
CKA(int id, string wyk, string alb, string gat, int iu, int ccnag, int pcnag){
idp=id;
w=wyk;
a=alb;
g=gat;
ilu=iu;
ccn=ccnag;
pcn=pcnag;
};
~CKA();
void WyswietlInfo(){
cout << "Informacje o pozycji:" << endl;
cout << "Id pozycji:" << idp << endl;
cout << "Wykonawca:" << w << endl;
cout << "Album:" << a << endl;
cout << "Gatunek:" << g << endl;
cout << "Ilość utworów:" << ilu << endl;
cout << "Całkowity czas nagrania:" << ccn << endl;
cout << "Pozostały czas nagrywania:" << pcn << endl;
}
};
class CKV : public IKaseta{
public:
string tf;
string g;
CKV(int id, string tyt, string gat, int ccnag, int pcnag){
idp=id;
tf=tyt;
g=gat;
ccn=ccnag;
pcn=pcnag;
};
~CKV();
void WyswietlInfo(){
cout << "Informacje o pozycji:" << endl;
cout << "Id pozycji:" << idp << endl;
cout << "Tytuł filmu:" << tf << endl;
cout << "Gatunek filmu:" << g << endl;
cout << "Całkowity czas nagrania:" << ccn << endl;
cout << "Pozostały czas nagrywania:" << pcn << endl;
}
};
/* przygotowanie struktury listy dynamicznej */
struct SPozycja{
IPozycja* WP;
SPozycja* PP;
SPozycja* NP;
};
SPozycja* glowa=NULL;
SPozycja* ogon=NULL;
int id=0;
char w[1];
bool pro=true;
bool typ;
string wykonawca, album, gatunek;
int iloscutworow, ccnagrania;
int _tmain(int argc, _TCHAR* argv[]){
cout << "Witam w programie bedacym obiektowa baza danych plyt i kaset audio i wideo!" << endl;
while(pro){
cout << "Wybierz wlasciwa opcje:" << endl;
cout << "d - dodaj nowa pozycje" << endl;
cout << "u - usun istniejaca pozycje" << endl;
cout << "p - pokaz dostepne pozycje" << endl;
cout << "a - autor programu" << endl;
cout << "w - wyjscie z programu" << endl;
cin >> w[0];
system("cls");
switch(w[0]){
case 'd':
typ=true;
while(typ){
cout << "Dodawanie nowych pozycji" << endl;
cout << "Wybierz typ, ktory chcesz dodac" << endl;
cout << "1 - plyta audio" << endl;
cout << "2 - plyta wideo" << endl;
cout << "3 - kaseta audio" << endl;
cout << "4 - kaseta wideo" << endl;
cout << "w - chce przejsc wstecz i wrocic do menu" << endl;
cin >> w[0];
system("cls");
switch(w[0]){
case '1':
cout << "Podaj nazwe wykonawcy:" << endl;
cin >> wykonawca;
cout << "Podaj nazwe albumu:" << endl;
cin >> album;
cout << "Podaj nazwe gatunku:" << endl;
cin >> gatunek;
cout << "Podaj ilosc utworow:" << endl;
cin >> iloscutworow;
cout << "Podaj calkowity czas nagrania:" << endl;
cin >> ccnagrania;
id++;
if (glowa==NULL){
glowa=new SPozycja;
glowa->WP=new CPA(id,wykonawca,album,gatunek,iloscutworow,ccnagrania); // tej linijki dotyczy błąd
glowa->PP=NULL;
glowa->NP=NULL;
ogon=glowa;
}
break;
case '2':
break;
case '3':
break;
case '4':
break;
case 'w':
typ=false;
cout << "Wybrano powrot do menu glownego" << endl;
break;
default:
{
cout << "Bledny wybor" << endl;
system("PAUSE");
system("cls");
}
}
}
break;
case 'u':
cout << "Usuwanie istniejacej pozycji" << endl;
break;
case 'p':
cout << "Pokazanie istniejacych pozycji" << endl;
break;
case 'a':
cout << "Autor programu: XYZ" << endl;
break;
case 'w':
pro=false;
cout << "Program zakonczyl sie pomyslnie. Zycze udanego dnia :-)" << endl;
break;
default:
cout << "Bledny wybor" << endl;
}
system("PAUSE");
system("cls");
}
//cin.get();
//getchar();
//system("PAUSE");
return 0;
}
Treść logu kompilacji z informacją o błędzie wykrytym w zaznaczonej linijce komentarzem.
------ Kompilacja rozpoczęta: ProjektProjekt z PK - katalog płyt i kaset AV, KonfiguracjaDebug Win32 ------
Build started 2012-08-24 14:37:13.
InitializeBuildStatus:
Creating "Debug\Projekt z PK - katalog płyt i kaset AV.unsuccessfulbuild" because "AlwaysCreate" was specified.
ClCompile:
stdafx.cpp
Projekt z PK - katalog płyt i kaset AV.cpp
Projekt z PK - katalog płyt i kaset AV.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall IPlyta::~IPlyta(void)" (??1IPlyta@@UAE@XZ) referenced in function __unwindfunclet$??0CPA@@QAE@HV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00HH@Z$0
Projekt z PK - katalog płyt i kaset AV.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall CPA::~CPA(void)" (??1CPA@@UAE@XZ) referenced in function "public: virtual void * __thiscall CPA::`scalar deleting destructor'(unsigned int)" (??_GCPA@@UAEPAXI@Z)
Projekt z PK - katalog płyt i kaset AV.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall IPozycja::~IPozycja(void)" (??1IPozycja@@UAE@XZ) referenced in function "public: virtual void * __thiscall IPozycja::`scalar deleting destructor'(unsigned int)" (??_GIPozycja@@UAEPAXI@Z)
D:\Visual Studio 2010\Projects\Projekt z PK - katalog płyt i kaset AV\Debug\Projekt z PK - katalog płyt i kaset AV.exe : fatal error LNK1120: 3 unresolved externals
Kompilacja NIE POWIODŁA SIĘ.
Time Elapsed 00:00:05.98
========== Kompilacja: 0 zakończono powodzeniem, 1 zakończono niepowodzeniem, 0 zaktualizowano, 0 pominięto ==========
Gdyby ktoś mógł mi wyjaśnić jak poprawić kod w tej linijce to byłbym wdzięczny.