home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / INTROCPP / PROG5-6.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-12-01  |  3.7 KB  |  182 lines

  1. /*
  2.    prog5-6.cpp
  3.  
  4.    Demonstrerar, tillsammans med prog5-5.cpp, skillnaden mellan polymorfa
  5.    och icke polymorfa klasser. En lista med anställda sparas i vektorn list,
  6.    och funktionen report används för att låta varje anställd i listan avge
  7.    rapport (via medlemsfunktionen report). 
  8.    I denna version har medlemsfunktionen employee::report (och därmed även
  9.    manager::report) gjorts virtuell, liksom klassens destruktor. Detta gör 
  10.    employee och manager till polymorfa klasser, vilket löser problemen som 
  11.    uppstod i prog5-5.cpp. Inga andra ändringar har gjorts.
  12. */
  13.  
  14. #include <iostream.h>
  15. #include <string.h>
  16.  
  17. // klassen employee
  18. class employee
  19. {
  20.   private:
  21.     
  22.     char* name;
  23.     int   salary;
  24.  
  25.   public:
  26.  
  27.     // konstruktor
  28.     employee(const char*, int = 13000);
  29.  
  30.     // hämta namn och lön
  31.     const char* getname() { return name; }
  32.     const int getsalary() { return salary; }
  33.  
  34.     // rapportera
  35.     virtual void report();
  36.  
  37.     // destruktor
  38.     virtual ~employee() { };
  39. };
  40.  
  41. // konstruktor för employee
  42. employee::employee(const char* n, int s)
  43. : salary(s)
  44. {
  45.   name = new char[strlen(n)+1];
  46.   strcpy(name,n);
  47. }
  48.  
  49. // anställds rapport
  50. void employee::report()
  51. {
  52.   cout << name << ' ';
  53.   cout << salary << ' ';
  54. }
  55.  
  56. // klassen manager
  57. class manager : public employee
  58. {
  59.   private:
  60.  
  61.     employee** group;
  62.     int        groupsize;
  63.  
  64.   public:
  65.  
  66.     // konstruktor
  67.     manager(const char*, int = 20000);
  68.  
  69.     // rapportera
  70.     void report(); 
  71.  
  72.     // lägg till en anställd i gruppen
  73.     void hire(employee*);
  74.  
  75.     // destruktor
  76.     virtual ~manager();
  77. };
  78.  
  79. // konstruktor för manager
  80. manager::manager(const char* n, int s)
  81. : employee(n,s)
  82. {
  83.   // skapa en grupp utan medlemmar
  84.   groupsize = 0;
  85.   group = new employee*[groupsize+1];
  86.   group[groupsize] = 0;
  87. }
  88.  
  89. // chefs rapport
  90. void manager::report()
  91. {
  92.   employee::report();  
  93.   
  94.   // skriv ut medlemmar i arbetsgruppen
  95.   cout << "( ";
  96.   for(employee** e = group; *e != 0; e++)
  97.   {
  98.     cout << (*e)->getname() << ' ';
  99.   }
  100.   cout << ") ";
  101. }
  102.  
  103. // lägg till en anställd i gruppen
  104. void manager::hire(employee* newemp)
  105. {
  106.   // öka gruppstorlek med ett
  107.   groupsize++;
  108.   
  109.   // skapa en ny grupp, med plats för ytterligare en medlem
  110.   employee** newgroup = new employee*[groupsize+1];
  111.  
  112.   // kopiera de gamla gruppmedlemmarna
  113.   for(int i = 0; i < groupsize - 1; i++)
  114.   {
  115.     newgroup[i] = group[i];
  116.   }
  117.   
  118.   // lägg till ny medarbetare i den nya gruppen
  119.   newgroup[groupsize-1] = newemp;
  120.  
  121.   // avsluta listan med null
  122.   newgroup[groupsize] = 0;
  123.  
  124.   // ta bort gammal grupp
  125.   delete[] group;
  126.  
  127.   // använd ny grupp istället 
  128.   group = newgroup;
  129. }
  130.  
  131. // destruktor för manager
  132. manager::~manager()
  133. {
  134.   // manager ansvarar inte för destruktion av employee-objekten
  135.   // i gruppen, bara för listan med pekare
  136.   delete[] group;
  137. }
  138.  
  139. // skriv ut en rapport för alla anställda
  140. void report(employee** emp, int n)
  141. {
  142.   for(int i=0; i < n; i++)
  143.   {
  144.     emp[i]->report();
  145.     cout << '\n';
  146.   }
  147. }
  148.  
  149. main()
  150. {
  151.   const int employees = 5;
  152.   employee* list[employees];
  153.  
  154.   // lägg till anställda
  155.   list[0] = new employee("Siv");
  156.   list[1] = new employee("Sten",15000);
  157.   list[2] = new employee("Sören");
  158.   list[3] = new employee("Susan",14000);
  159.  
  160.   // lägg till chef för de övriga
  161.   manager* boss = new manager("Stan");
  162.   boss->hire(list[0]);
  163.   boss->hire(list[1]);
  164.   boss->hire(list[2]);
  165.   boss->hire(list[3]);
  166.   list[4] = boss;
  167.   
  168.   // skriv ut rapport för alla anställda
  169.   cout << "Aktuell anställningsstatus:\n";
  170.   report(list,employees);
  171.  
  172.   // glöm inte bort att deallokera allokerat minne!
  173.   for(int i=0;i<employees;i++)
  174.   {
  175.     delete list[i];
  176.   }
  177.  
  178.   return 0;
  179. }
  180.  
  181.  
  182.