home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC7.DMS / in.adf / classes.lha / Classes / Exec / Share.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-31  |  2.6 KB  |  77 lines

  1. #ifndef CPP_EXEC_SHARE_H
  2. #define CPP_EXEC_SHARE_H
  3.  
  4. // Eine Klasse zur Verwaltung mehrfach benutzter Resourcen
  5. //
  6. // Kopiert man Instanzen, die eine Resource alloziieren und im Destruktor
  7. // freigeben, so ist die Resource mehrfach referenziert und darf erst
  8. // durch den letzten Destruktor freigegeben werden. Dabei hilft die Klasse
  9. // ShareC. Am einfachsten erbt man von dieser Klasse. Allerdings muß diese
  10. // Klasse selbst etwas dynamischen Speicher alloziieren, die Konstruktion
  11. // kann also fehlschlagen, dann wird die Ausnahme MemoryX ausgeworfen. Mit
  12. // only() kann man herausfinden, ob die Instanz die einzige Referenz hält.
  13. //
  14. // Der Destruktor muß mit only() testen, ob diese Instanz die letzte
  15. // letzte Referenz enthält: liefert only() das Ergebnis TRUE, so muß
  16. // die Resource freigegeben werden.
  17. //
  18. // Der Zuweisungsoperator funktioniert entsprechend: Zuerst muß mit only()
  19. // getestet werden, ob die Resource freizugeben ist, danach wird der
  20. // Zuweisungsoperator der Klasse ShareC aufgerufen. Diesem folgen die
  21. // weiteren Zuweisungen, überlichweise zumindest die Zuweisung der Referenz
  22. // auf die Resource.
  23. //
  24. // Die Klasse ShareManualC erfüllt eine ähnliche Aufgabe, hier muß man jedoch
  25. // die Referenzierung (reference()) und Dereferenzierung (dereference())
  26. // selbst vornehmen. Der Gebrauch dieser Klasse ist dann sinnvoll, wenn
  27. // eine Resource nicht direkt an eine Klasse gebunden ist, d.h. nicht
  28. // unbedingt bei jedem Kopieren oder Zuweisen zusätzlich neu referenziert
  29. // wird.
  30. //
  31. // Destruktor und Zuweisungsoperator funktionieren der Klasse ShareC
  32. // entsprechend. Nur die Referenzierungen müssen "zu Fuß" vorgenommen
  33. // werden. Normalerweise sollte es nicht passieren, daß im "letzten"
  34. // Destruktor (bzw. Zuweisungsoperator) die Methode only() das Ergebnis
  35. // FALSE liefert und damit die Resource nicht freigegeben wird, obwohl die
  36. // letzte Referenz darauf verloren geht. Dies ist normalerweise ein
  37. // Ungleichgewicht in der Benutzung von reference() und dereference().
  38. //
  39. // Autor: Jochen Becher
  40. //
  41. // Historie:
  42. // Version 1.0 am 25. Juni 94
  43.  
  44. #ifndef EXEC_TYPES_H
  45. #include <exec/types.h>
  46. #endif
  47.  
  48. #ifndef CPP_EXCEPTIONS_EXCEPTIONS_H
  49. #include <classes/exceptions/exceptions.h>
  50. #endif
  51.  
  52. class ShareC {
  53. public:
  54.     ShareC() throw (MemoryX);
  55.     ShareC(const ShareC &);
  56.     ~ShareC();
  57.     ShareC &operator = (const ShareC &);
  58.     BOOL only() const;
  59. private:
  60.     ULONG *counter;
  61. };
  62.  
  63. class ShareManualC : private ShareC {
  64. public:
  65.     ShareManualC() throw (MemoryX);
  66.     ShareManualC(const ShareManualC &);
  67.     ~ShareManualC();
  68.     ShareManualC &operator = (const ShareManualC &);
  69.     VOID reference();
  70.     VOID dereference();
  71.     BOOL only() const;
  72. private:
  73.     ULONG *references;
  74. };
  75.  
  76. #endif
  77.