Lektion 74:

Die Klasse StackAsLinkedList

Trägt man den Code aus der vorhergehenden Lektion zusammen, dann ergibt sich folgende Klasse:

class Element
{
private:
   int m_wert;
   Element *m_pNeachstesElement;
};
class StackAsLinkedList
{
private:
   Element *m_pStart;
public:
   void push(int wert)
   {
      Element *pNeuesElement=new Element;
      *pNeuesElement.m_wert=wert;
      *pNeuesElement.m_pNeachstesElement=m_pStart;
      m_pStart=pNeuesElement;
   };
   void pop()
   {
      Element *pZuLoeschendesElement=m_pStart;
      pStart=*m_pStart.pNeachstesElement;
      delete pZuLoeschendesElement;
   };
};

Eigentlich sieht der Code recht gut aus. Doch Ihr Compiler wird Sie mit vielen Fehlermeldungen überraschen, wenn Sie ihn compilieren wollen. Das hat zwei Gründe:

1. Die Attribute in der Klasse Element sind private. Deshalb können Methoden der Klasse StackAsLinkedList nicht darauf zugreifen. Das soll für den Moment dadurch behoben werden, daß das private in der Klasse Element durch public ersetzt wird. Das ist im Moment recht unschön, doch in Kürze wird dieses Manko wieder ausgeglichen werden.

2. Ausdrücke wie

   *pNeuesElement.m_pNeachstesElement=m_pStart;

funktionieren nicht. Das liegt an den Prioritäten der Operatoren '.' und '*'. Dies ist ein weiterer Fallstrick in den Operatoren-Prioritäten. Der Compiler hält nämlich den Punkt für wichtiger. Für ihn ist

   *pNeuesElement.m_pNeachstesElement=m_pStart;

das gleiche wie

   *(pNeuesElement.m_pNeachstesElement)=m_pStart;

Damit der Compiler weiß, was eigentlich gemeint war, müssen also Klammern gesetzt werden.

   (*pNeuesElement).m_pNeachstesElement=m_pStart;

Die mit diesen Änderungen versehene Klasse sieht so aus:

class Element
{
public:
   int m_wert;
   Element *m_pNeachstesElement;
};
class StackAsLinkedList
{
private:
   Element *m_pStart;
public:
   void push(int wert)
   {
      Element *pNeuesElement=new Element;
      (*pNeuesElement).m_wert=wert;
      (*pNeuesElement).m_pNeachstesElement=m_pStart;
      m_pStart=pNeuesElement;
   };
   void pop()
   {
      Element *pZuLoeschendesElement=m_pStart;
      m_pStart=(*m_pStart).m_pNeachstesElement;
      delete pZuLoeschendesElement;
   };
};

Übung:

Vervollständigen Sie die Klasse StackAsLinkedList so, daß sie die gleiche Schnittstelle hat, wie die Klasse StackAsVector.

Wegen der umständlichen Schreibweise

   (*a).b

gibt es einen eigenen Operator, der nur diese Schreibweise vereinfacht.

   a->b

ist für Zeiger als a definiert als

   (*a).b

 Verwenden Sie überall, wo nötig den operator->, und verbessern Sie die Klasse StackAsLinkedList entsprechend.

Einsendungen:

Lösungsvorschlag
Da fehlt noch was


Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 09/06/00