Projekt - problem

0

Witam!!
Mam do napisania projekt.
Projekt musi spełniać następujące warunki:

  1. Jego implementacja powinna wymagać zastosowania hierarchii klas o conajmniej trzech poziomach.
  2. Hierarchia klas powinna zawierać klasy abstrakcyjne.
  3. W implementacji należy zastosować polimorficzne wywołania operacji zdefiniowanych w nadrzędnej klasie abstrakcyjnej.
  4. 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.

0
#include <iostream>

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;
        };
        virtual ~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;
        };
        virtual ~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;
        };
        virtual ~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 main(){
        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];
                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];
                                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);
                                                        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;
                                        }
                                }
                        }
                        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;
                }
        }
        return 0;
}

Co to za destruktory które nie mają implementacji?!

Oczywiście inną sprawą jest to że kod jest tragiczny a za jednoliterkowe nazwy zmiennych powinno się łamać kołem...

0

@Shalom
Dlaczego mówisz, że jego kod jest tragiczny? Jaki według Ciebie powinien być? Jakie są standardy typu: http://msdn.microsoft.com/pl-pl/library/jj590160(v=vs.100) aby kod wyglądał ładniej?

0

Czemu tragiczne?

  1. Wszystkie pola klas publiczne
  2. Jednoznakowe nazwy zmiennych/pól
  3. Brak znajomości konstrukcji języka (lista inicjalizacyjna konstruktora)
  4. Brak znajomości składni (średniki po } zamykającej funkcje)
  5. Zmienne globalne w kodzie
  6. Gigantyczny main() z wielopoziomowymi zagłębieniami, zamiast upakowania odpowiednich operacji w klasach, tak jak być powinno.
0

Imo czytając treść zadania nie wywnioskowałem, żeby nie można bylo korzystać z STL'owej listy, co wpłynęłoby pozytywnie na ilość kodu oraz ułatwiłoby samą implementacje problemu.

No i tak jak wyżej musisz zadbać o destruktory. To nie java.

0

Po co mu tutaj destruktory?
Nie ma tu żadnych tablic ani nic co by potrzebowało destruktory, także spokojnie destruktor może zrobić za niego kompilator.

1 użytkowników online, w tym zalogowanych: 0, gości: 1