<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Präfix-&#x2F;Postfix-Operatoren überladen]]></title><description><![CDATA[<p>Ich habe folgendes Problem zu lösen:</p>
<p><em>Schreiben Sie die drei Klassen Objekt, Liste und Iterator, die folgende Funktionalität bieten sollen: Objekt ist ein Stellvertreter für eine beliebige Klasse. Diese Klasse sollte für Testzwecke zumindest eine print Methode aufweisen, die eine eindeutig Identifizierung der Objekte ermöglicht. Liste soll Objekte in einem Array verwalten. Die Liste soll die Methoden add und insert aufweisen, die ein Objekt am Ende bzw. am Beginn der Liste einfügen können. Iterator soll einen Konstruktor haben, der den Iterator an den Beginn der Liste setzt, die Operatoren ++ und --, die zum Weiter- bzw. Zurückgehen in der Liste dienen und eine Methode obj, die das aktuelle Objekt retourniert. Unter der Annahme, dass die Liste mit den vier Objekten 'a', 'b', 'c' und 'd' gefüllt ist, soll z.B. folgendes Programmstück die angeführten Ergebnisse liefern:</em></p>
<p><strong>Iterator it;<br />
it.obj().print(); //Ausgabe von 'a'<br />
it++;<br />
it.obj().print(); //Ausgabe von 'b'<br />
it--;<br />
it.obj().print(); //Ausgabe von 'a'</strong></p>
<p>(soweit ist alles klar; der gesamte Code läuft einwandfrei)</p>
<p><em>Ändern Sie die Klasse Iterator nun so, dass die Methode obj überflüssig wird. Statt dessen soll der Operator * (Dereferenzierung) und die Operatoren ++ und -- derart überladen werden, dass das kurze Programmstück im Beispiel aus der Vorwoche nun folgendermaßen geschrieben werden kann:</em><br />
Iterator it;</p>
<p>**(*it++).print(); //Ausgabe von 'a'<br />
(<em>it--).print(); //Ausgabe von 'b'<br />
(<em>it).print(); //Ausgabe von 'a'</em></em></p>
<p>Die Deklarationen von Objekt &amp; Liste sehen folgendermaßen aus:<br />
(Methode 'obj' heißt hier 'Member'; außerdem nimmt Objekt Daten vom typ int auf)</p>
<pre><code class="language-cpp">const int iSize=128;

//Demo-Klasse für den Listeniterator
//Objekte werden in eine Liste aufgenommen
class Objekt
{
  private:
    int iDaten;

  public:

//KONSTRUKTOR

    Objekt (int Daten=-1);

//METHODEN
    //Gleich wie Konstruktor
    void setValue (int Daten);

    //Objektzahl ausgeben
    void print ();
};

//Auf ihr operiert der Iterator
class Liste
{
  private:
    //Array an Objekten
    Objekt oObjekte[iSize];

    //Höchster Index im Array
    int MaxIndex;

  public:

//KONSTRUKTOREN

    //Leere Liste
    Liste ();
    //Übernimmt ein Array an Objekten &amp; dessen Größe (Überlauf!)
    Liste (Objekt Objekte[iSize], int ActualSize);
//METHODEN
    //Objekt am Ende einfügen
    bool addEnd (Objekt oInput);
    //Objekt am Beginn einfügen    
    bool insertFirst (Objekt oInput);

    //Anzahl der Objekte im Array
    int count ();
    //Ein einzelnes Objekt
    Objekt Member (int Index);
};
</code></pre>
<p>Ich habe die entsprechenden Operatoren der Klasse Iterator nun folgendermaßen definiert:</p>
<pre><code class="language-cpp">//Setzt den Iterator ans nächste Listenelement
    //Beginnt von vorne wenn am Ende    
    void Iterator::operator++ (int)
    {    
         iAktuelleStelle = (iAktuelleStelle == lListe.count()-1 ? 0 : ++(iAktuelleStelle));
         //return operator*();         
    }

    //Setzt den Iterator ans vorige Listenelement
    //Beginnt von hinten wenn am Anfang
    void Iterator::operator-- (int)
    {
         iAktuelleStelle = (iAktuelleStelle == 0 ? lListe.count()-1 : --(iAktuelleStelle));         
         //return operator*();                  
    }

    //Retourniert das Objekt an der aktuelle Position
    Objekt Iterator::operator* () 
    {
         return lListe.Member (iAktuelleStelle);
    }
</code></pre>
<p>Der Operatoraufruf funktioniert problemlos, solange ich nur jeweils einen Operator verwende:</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;\nWert an voriger Stelle: &quot;; (*it).print(); (it++); //richtige Ausgabe
cout &lt;&lt; &quot;\nWert an aktueller Stelle: &quot;; (*it).print(); //richtige Ausgabe
</code></pre>
<p>Problematisch wirds allerdings hier:</p>
<pre><code class="language-cpp">(*it++).print();
</code></pre>
<p>Compilerfehler: <strong>'void value not ignored as it ought to be'</strong></p>
<p>Ändere ich nun die Ergebnistypen in Iterator entsprechend:</p>
<pre><code class="language-cpp">//Setzt den Iterator ans nächste Listenelement
    //Beginnt von vorne wenn am Ende    
    Objekt Iterator::operator++ (int)
    {    
         iAktuelleStelle = (iAktuelleStelle == lListe.count()-1 ? 0 : ++(iAktuelleStelle));
         return operator*();         
    }

    //Setzt den Iterator ans vorige Listenelement
    //Beginnt von hinten wenn am Anfang
    Objekt Iterator::operator-- (int)
    {
         iAktuelleStelle = (iAktuelleStelle == 0 ? lListe.count()-1 : --(iAktuelleStelle));         
         return operator*();                  
    }

    //Retourniert das Objekt an der aktuelle Position
    Objekt Iterator::operator* () 
    {
         return lListe.Member (iAktuelleStelle);
    }
</code></pre>
<p>Erhalte ich stattdessen die Meldung:<br />
<em><em>'no match for 'operator</em>' in '*(&amp;it)-&gt;Iterator::operator++(0)''</em>*</p>
<p>Ich habe zwar Vermutungen, wie die beiden Meldungen zu interpretieren sein könnten, aber bis jetzt keine Lösung gefunden.<br />
<strong>Bin daher für jeden Lösungsansatz dankbar!</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167466/präfix-postfix-operatoren-überladen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 23:38:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167466.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 Dec 2006 13:52:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Präfix-&#x2F;Postfix-Operatoren überladen on Mon, 11 Dec 2006 13:52:39 GMT]]></title><description><![CDATA[<p>Ich habe folgendes Problem zu lösen:</p>
<p><em>Schreiben Sie die drei Klassen Objekt, Liste und Iterator, die folgende Funktionalität bieten sollen: Objekt ist ein Stellvertreter für eine beliebige Klasse. Diese Klasse sollte für Testzwecke zumindest eine print Methode aufweisen, die eine eindeutig Identifizierung der Objekte ermöglicht. Liste soll Objekte in einem Array verwalten. Die Liste soll die Methoden add und insert aufweisen, die ein Objekt am Ende bzw. am Beginn der Liste einfügen können. Iterator soll einen Konstruktor haben, der den Iterator an den Beginn der Liste setzt, die Operatoren ++ und --, die zum Weiter- bzw. Zurückgehen in der Liste dienen und eine Methode obj, die das aktuelle Objekt retourniert. Unter der Annahme, dass die Liste mit den vier Objekten 'a', 'b', 'c' und 'd' gefüllt ist, soll z.B. folgendes Programmstück die angeführten Ergebnisse liefern:</em></p>
<p><strong>Iterator it;<br />
it.obj().print(); //Ausgabe von 'a'<br />
it++;<br />
it.obj().print(); //Ausgabe von 'b'<br />
it--;<br />
it.obj().print(); //Ausgabe von 'a'</strong></p>
<p>(soweit ist alles klar; der gesamte Code läuft einwandfrei)</p>
<p><em>Ändern Sie die Klasse Iterator nun so, dass die Methode obj überflüssig wird. Statt dessen soll der Operator * (Dereferenzierung) und die Operatoren ++ und -- derart überladen werden, dass das kurze Programmstück im Beispiel aus der Vorwoche nun folgendermaßen geschrieben werden kann:</em><br />
Iterator it;</p>
<p>**(*it++).print(); //Ausgabe von 'a'<br />
(<em>it--).print(); //Ausgabe von 'b'<br />
(<em>it).print(); //Ausgabe von 'a'</em></em></p>
<p>Die Deklarationen von Objekt &amp; Liste sehen folgendermaßen aus:<br />
(Methode 'obj' heißt hier 'Member'; außerdem nimmt Objekt Daten vom typ int auf)</p>
<pre><code class="language-cpp">const int iSize=128;

//Demo-Klasse für den Listeniterator
//Objekte werden in eine Liste aufgenommen
class Objekt
{
  private:
    int iDaten;

  public:

//KONSTRUKTOR

    Objekt (int Daten=-1);

//METHODEN
    //Gleich wie Konstruktor
    void setValue (int Daten);

    //Objektzahl ausgeben
    void print ();
};

//Auf ihr operiert der Iterator
class Liste
{
  private:
    //Array an Objekten
    Objekt oObjekte[iSize];

    //Höchster Index im Array
    int MaxIndex;

  public:

//KONSTRUKTOREN

    //Leere Liste
    Liste ();
    //Übernimmt ein Array an Objekten &amp; dessen Größe (Überlauf!)
    Liste (Objekt Objekte[iSize], int ActualSize);
//METHODEN
    //Objekt am Ende einfügen
    bool addEnd (Objekt oInput);
    //Objekt am Beginn einfügen    
    bool insertFirst (Objekt oInput);

    //Anzahl der Objekte im Array
    int count ();
    //Ein einzelnes Objekt
    Objekt Member (int Index);
};
</code></pre>
<p>Ich habe die entsprechenden Operatoren der Klasse Iterator nun folgendermaßen definiert:</p>
<pre><code class="language-cpp">//Setzt den Iterator ans nächste Listenelement
    //Beginnt von vorne wenn am Ende    
    void Iterator::operator++ (int)
    {    
         iAktuelleStelle = (iAktuelleStelle == lListe.count()-1 ? 0 : ++(iAktuelleStelle));
         //return operator*();         
    }

    //Setzt den Iterator ans vorige Listenelement
    //Beginnt von hinten wenn am Anfang
    void Iterator::operator-- (int)
    {
         iAktuelleStelle = (iAktuelleStelle == 0 ? lListe.count()-1 : --(iAktuelleStelle));         
         //return operator*();                  
    }

    //Retourniert das Objekt an der aktuelle Position
    Objekt Iterator::operator* () 
    {
         return lListe.Member (iAktuelleStelle);
    }
</code></pre>
<p>Der Operatoraufruf funktioniert problemlos, solange ich nur jeweils einen Operator verwende:</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;\nWert an voriger Stelle: &quot;; (*it).print(); (it++); //richtige Ausgabe
cout &lt;&lt; &quot;\nWert an aktueller Stelle: &quot;; (*it).print(); //richtige Ausgabe
</code></pre>
<p>Problematisch wirds allerdings hier:</p>
<pre><code class="language-cpp">(*it++).print();
</code></pre>
<p>Compilerfehler: <strong>'void value not ignored as it ought to be'</strong></p>
<p>Ändere ich nun die Ergebnistypen in Iterator entsprechend:</p>
<pre><code class="language-cpp">//Setzt den Iterator ans nächste Listenelement
    //Beginnt von vorne wenn am Ende    
    Objekt Iterator::operator++ (int)
    {    
         iAktuelleStelle = (iAktuelleStelle == lListe.count()-1 ? 0 : ++(iAktuelleStelle));
         return operator*();         
    }

    //Setzt den Iterator ans vorige Listenelement
    //Beginnt von hinten wenn am Anfang
    Objekt Iterator::operator-- (int)
    {
         iAktuelleStelle = (iAktuelleStelle == 0 ? lListe.count()-1 : --(iAktuelleStelle));         
         return operator*();                  
    }

    //Retourniert das Objekt an der aktuelle Position
    Objekt Iterator::operator* () 
    {
         return lListe.Member (iAktuelleStelle);
    }
</code></pre>
<p>Erhalte ich stattdessen die Meldung:<br />
<em><em>'no match for 'operator</em>' in '*(&amp;it)-&gt;Iterator::operator++(0)''</em>*</p>
<p>Ich habe zwar Vermutungen, wie die beiden Meldungen zu interpretieren sein könnten, aber bis jetzt keine Lösung gefunden.<br />
<strong>Bin daher für jeden Lösungsansatz dankbar!</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190121</guid><dc:creator><![CDATA[Christian++ 1]]></dc:creator><pubDate>Mon, 11 Dec 2006 13:52:39 GMT</pubDate></item><item><title><![CDATA[Reply to Präfix-&#x2F;Postfix-Operatoren überladen on Mon, 11 Dec 2006 13:59:19 GMT]]></title><description><![CDATA[<p>Wenn du die Rückgabe von op++ dereferenzieren willst, mußt du dort einen sinnvollen Rückgabewert angeben:</p>
<p>üblicherweise sehen die Inkrement-Operatoren übrigens so aus:</p>
<pre><code class="language-cpp">Typ&amp; operator++()
{
  //Präfix-Inkrement ++x
  return *this;
}

Typ operator++(int)
{
  Typ tmp=*this;
  ++this;
  return tmp;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1190125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190125</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 11 Dec 2006 13:59:19 GMT</pubDate></item><item><title><![CDATA[Reply to Präfix-&#x2F;Postfix-Operatoren überladen on Mon, 11 Dec 2006 14:10:47 GMT]]></title><description><![CDATA[<p>Eigentlich sollte der operator++(int) eine Kopie von Iterator zurückgeben.</p>
<p>Der Postfix operator++ kann übrigens ruhig ein konstantes Objekt zurückgeben:</p>
<pre><code class="language-cpp">const Iterator Iterator::operator++( int )
{
  Iterator tmp( *this );
  // ...
  return tmp;
}
</code></pre>
<p>Edit:<br />
Bei deinem Dereferenzierungsoperator wäre eine konstante Referenz als Rückgabetyp besser.</p>
<pre><code class="language-cpp">const Objekt&amp; operator*() const
{
}
</code></pre>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190126</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 11 Dec 2006 14:10:47 GMT</pubDate></item><item><title><![CDATA[Reply to Präfix-&#x2F;Postfix-Operatoren überladen on Mon, 11 Dec 2006 14:19:49 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Bei deinem Dereferenzierungsoperator wäre eine konstante Referenz als Rückgabetyp besser.</p>
<pre><code class="language-cpp">const Objekt&amp; operator*() const
{
}
</code></pre>
<p>grüße</p>
</blockquote>
<p>Das hängt davon ab, ob die Konstanz des Iterators die Konstanz des Objekts zur Folge haben soll. Für viele (in meiner Erfahrung die meisten) Iteratoren und Smartpointer gilt das nicht. Auch für den normalen Pointer als Prototyp des Iterators ist das ja nicht der Fall. Richtig ist aber, dass der Operator selbst const sein sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190137</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 11 Dec 2006 14:19:49 GMT</pubDate></item><item><title><![CDATA[Reply to Präfix-&#x2F;Postfix-Operatoren überladen on Mon, 11 Dec 2006 14:22:26 GMT]]></title><description><![CDATA[<p>So wie Christian++ den Operator deklariert hat, hätte ein ändern des Objekts garkeinen Erfolg im Bezug auf das Objekt innerhalb des Iterators. Ansonsten soll er eben eine nicht konstante Referenz zurückgeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190141</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Mon, 11 Dec 2006 14:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to Präfix-&#x2F;Postfix-Operatoren überladen on Mon, 11 Dec 2006 14:24:24 GMT]]></title><description><![CDATA[<p>Wahnsinn, dieses Forum... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Herzlichen Dank an Euch alle!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190142</guid><dc:creator><![CDATA[Christian++ 1]]></dc:creator><pubDate>Mon, 11 Dec 2006 14:24:24 GMT</pubDate></item></channel></rss>