next up previous contents index
Nächste Seite: 9. File Input und Aufwärts: 8. Der Datentyp Klasse Vorherige Seite: 8.5 Der Printoperator   Inhalt   Index


8.6 Datenkapselung

Die Daten in Studenten wurden als public klassifiziert, d.h., jeder kann auf diese Daten zugreifen, wie mittels mike.pvorname . Um diese Daten vor unerwünschtem Zugriff zu schützen und um das Datenlayout evtl. nachträglich ändern zu können, kapselt man die Daten so in die Klasse ein, daß sie nur noch über Zugriffsmethoden erreichbar sind. Die diesbezügliche Klassifikation wird durch das Schlüsselwort private angegeben. Damit ändert sich der Deklarationsteil der Klasse Studenten in

//      studenten2.hh
#include <iostream.h>

class Studenten
{
//			Data in Studenten are private now!!
private:
  long int matrikel;
       int skz;
      char *pname, *pvorname;

//                      Methods in Studenten
public:
//                      Constructors, Destructor, Access operator
 ...
//				Output operator
 friend ostream & operator<<(ostream  & s, const Studenten & orig);

//              Methods to access the private data
//                      Methods for data manipulation in Studenten
 void SetVorname(const char vorname[]);
 void SetName(const char name[]);
 void SetMatrikel(const long int  mat_nr);
 void SetSKZ(const int  skz_nr);

//                 Methods that don't manipulate data in Studenten
 const long int& GetMatrikel() const;
 const int& GetSKZ() const;
 const char* GetVorname() const;
 const char* GetName() const;
};
(siehe studenten2.hh)

In obigen Methoden sind zwei const Deklarationen zu finden. Ein const am Ende der Deklarationszeile zeigt an, daß die Daten in Studenten von der entsprechenden Methode, z.B., GetSKZ nicht verändert werden. Das const am Zeilenanfang gehört zum Ergebnistyp und zeigt an, daß die Daten auf welche mit der Referenz int& verwiesen wird nicht verändert werden dürfen. Damit wird gesichert, daß die Daten auch nicht unabsichtlich über Zeiger oder Referenzen manipuliert werden können.

Die Zugriffsmethoden werden wie folgt definiert:

//                   studenten2.cc     
#include "studenten2.hh"
...

void Studenten :: SetVorname(const char vorname[])
{
 if (pvorname != 0) delete [] pvorname;
 pvorname = new char[strlen(vorname)+1];
 strcpy(pvorname,vorname); 
 return;
}

void Studenten :: SetSKZ(const int  skz_nr)
{
 skz = skz_nr;
 return;
}
...
const char* Studenten :: GetVorname() const
{
 return pvorname;
}

const int& Studenten :: GetSKZ() const
{
 return skz;
}
(siehe studenten2.cc)

Diese neuen Zugriffsmethoden können wie folgt benutzt werden:

//      Ex861.cc
#include <iostream.h>
#include <strings.h>
#include "studenten2.hh"

int main()
{
 Studenten mike("Arni", "Schwarz", 812, 7938592);
 
 cout << "mike : " << mike << endl;
 cout << endl;
//      Data in Studenten are private therefore --> inaccessible:
// cout << "Access to public data : ";
// cout << "mike.pvorname = " << mike.pvorname << endl;

//      Data in Studenten are private therefore :
 cout << "Access to private data via methods: " << endl;
 cout << "mike.pvorname = " << mike.GetVorname() << endl;
 
// mike.GetVorname()[3] = 'k';	// not allowed because of 'const'
// char *pp = mike.GetVorname();// not allowed because of 'const'
 char tmp[40];
 strcpy(tmp,mike.GetVorname());	// allowed

 return 0;
}
(siehe Ex861.cc)

Einige Zugriffsfunktionen, z.B., SetSKZ und GetSKZ sind so kurz, daß sich ein Funktionsaufruf wegen des Aufwandes der Parameterübergabe eigentlich nicht lohnt. In diesem Falle werden Deklaration und Definition einer Methode miteinander im Headerfile verknüpft, die Methode/Funktion wird inline definiert. Diese inline-Zeilen ersetzen jedesmal den Funktionsaufruf.

//	studenten3.hh

#include <iostream.h>

class Studenten
{
 ...
 void SetSKZ(const int  skz_nr)
 	{ skz = skz_nr; };           // inline function
 ...
 const int& GetSKZ() const
 	{ return skz; };             // inline function
};
(siehe studenten3.hh)


next up previous contents index
Nächste Seite: 9. File Input und Aufwärts: 8. Der Datentyp Klasse Vorherige Seite: 8.5 Der Printoperator   Inhalt   Index
Gundolf Haase 2004-01-15