home *** CD-ROM | disk | FTP | other *** search
- /*
- prog5-5.cpp
-
- Demonstrerar, tillsammans med prog5-6.cpp, skillnaden mellan polymorfa
- och icke polymorfa klasser. En lista med anställda sparas i vektorn list,
- och funktionen report används för att låta varje anställd i listan avge
- rapport (via medlemsfunktionen report).
- Eftersom medlemsfunktionen report hela tiden anropas via en pekare till
- employee, kommer alltid employee::report (och inte manager::report) att
- anropas, vilket innebär att chefens extra information (en lista över
- medlemmar i gruppen) aldrig att skrivas ut.
- Ytterligare ett problem är att när vi sist i programmet deallokerar
- alla element i vektorn list görs även detta via pekare till employee,
- så manager:s destruktor kommer aldrig att anropas.
- */
-
- #include <iostream.h>
- #include <string.h>
-
- // klassen employee
- class employee
- {
- private:
-
- char* name;
- int salary;
-
- public:
-
- // konstruktor
- employee(const char*, int = 13000);
-
- // hämta namn och lön
- const char* getname() { return name; }
- const int getsalary() { return salary; }
-
- // rapportera
- void report();
-
- // destruktor
- ~employee() { };
- };
-
- // konstruktor för employee
- employee::employee(const char* n, int s)
- : salary(s)
- {
- name = new char[strlen(n)+1];
- strcpy(name,n);
- }
-
- // anställds rapport
- void employee::report()
- {
- cout << name << ' ';
- cout << salary << ' ';
- }
-
- // klassen manager
- class manager : public employee
- {
- private:
-
- employee** group;
- int groupsize;
-
- public:
-
- // konstruktor
- manager(const char*, int = 20000);
-
- // rapportera
- void report();
-
- // lägg till en anställd i gruppen
- void hire(employee*);
-
- // destruktor
- ~manager();
- };
-
- // konstruktor för manager
- manager::manager(const char* n, int s)
- : employee(n,s)
- {
- // skapa en grupp utan medlemmar
- groupsize = 0;
- group = new employee*[groupsize+1];
- group[groupsize] = 0;
- }
-
- // chefs rapport
- void manager::report()
- {
- employee::report();
-
- // skriv ut medlemmar i arbetsgruppen
- cout << "( ";
- for(employee** e = group; *e != 0; e++)
- {
- cout << (*e)->getname() << ' ';
- }
- cout << ") ";
- }
-
- // lägg till en anställd i gruppen
- void manager::hire(employee* newemp)
- {
- // öka gruppstorlek med ett
- groupsize++;
-
- // skapa en ny grupp, med plats för ytterligare en medlem
- employee** newgroup = new employee*[groupsize+1];
-
- // kopiera de gamla gruppmedlemmarna
- for(int i = 0; i < groupsize - 1; i++)
- {
- newgroup[i] = group[i];
- }
-
- // lägg till ny medarbetare i den nya gruppen
- newgroup[groupsize-1] = newemp;
-
- // avsluta listan med null
- newgroup[groupsize] = 0;
-
- // ta bort gammal grupp
- delete[] group;
-
- // använd ny grupp istället
- group = newgroup;
- }
-
- // destruktor för manager
- manager::~manager()
- {
- // manager ansvarar inte för destruktion av employee-objekten
- // i gruppen, bara för listan med pekare
- delete[] group;
- }
-
- // skriv ut en rapport för alla anställda
- void report(employee** emp, int n)
- {
- for(int i=0; i < n; i++)
- {
- emp[i]->report();
- cout << '\n';
- }
- }
-
- main()
- {
- const int employees = 5;
- employee* list[employees];
-
- // lägg till anställda
- list[0] = new employee("Siv");
- list[1] = new employee("Sten",15000);
- list[2] = new employee("Sören");
- list[3] = new employee("Susan",14000);
-
- // lägg till chef för de övriga
- manager* boss = new manager("Stan");
- boss->hire(list[0]);
- boss->hire(list[1]);
- boss->hire(list[2]);
- boss->hire(list[3]);
- list[4] = boss;
-
- // skriv ut rapport för alla anställda
- cout << "Aktuell anställningsstatus:\n";
- report(list,employees);
-
- // glöm inte bort att deallokera allokerat minne!
- for(int i=0;i<employees;i++)
- {
- delete list[i];
- }
-
- return 0;
- }
-
-
-