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

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