<?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[Korrekte Nutzung von Konstruktor, Destruktor]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Da C++ Operator-Überladung erlaubt, möchte ich mit meinen Klassen &quot;rechnen&quot; können, wie mit einfachen Zahlen. Ein mathematischer Bruch wäre ein Beispiel für eine solche Klasse. In diesem Zusammenhang bekomme ich jedoch Probleme mit dem Erzeugen und Löschen von Objekten.<br />
Ich erwarte, dass bei jedem Objekt genau einmal der Destruktor aufgerufen wird, und es danach nicht mehr benutzt wird.</p>
<p>Nun habe ich eine Klasse &quot;Zahl&quot; erstellt: Ich habe den operator+ überladen, wirklich gerechnet wird aber in diesem Beispiel nichts. Es geht hier nur um das Erzeugen und Löschen der Objekte.</p>
<pre><code>// zahl.cpp
#include &quot;zahl.h&quot;
#include &lt;iostream&gt;
using namespace std;

unsigned int Zahl::nextId=1;

Zahl::Zahl() {
  id = nextId++;
  cout &lt;&lt; &quot;Zahl Nr. &quot; &lt;&lt; id &lt;&lt; &quot; wurde erzeugt.&quot; &lt;&lt; endl;
}

Zahl::Zahl(Zahl &amp;a) {
  id = nextId++;
  cout &lt;&lt; &quot;Zahl Nr. &quot; &lt;&lt; a.id &lt;&lt; &quot; wurde zu Nr. &quot; &lt;&lt; id &lt;&lt; &quot;kopiert.&quot; &lt;&lt; endl;
}

Zahl::~Zahl() {
  cout &lt;&lt; &quot;Zahl Nr. &quot; &lt;&lt; id &lt;&lt; &quot; wurde gelöscht.&quot; &lt;&lt; endl;
}

void Zahl::ausgeben() {
  cout &lt;&lt; &quot;Dies ist Zahl Nr. &quot; &lt;&lt; id &lt;&lt; endl;
}

Zahl Zahl::operator+(const Zahl &amp;a) {
  cout &lt;&lt; &quot;Addiere Zahlen Nr. &quot; &lt;&lt; id &lt;&lt; &quot; und &quot; &lt;&lt; a.id &lt;&lt; endl;
  Zahl neu;
  return neu;
}
</code></pre>
<pre><code>// zahl.h
#ifndef Zahl_H
#define Zahl_H

class Zahl {
  public:
    Zahl();
    Zahl(Zahl &amp;a);
    ~Zahl();
    void ausgeben();
    Zahl operator+(const Zahl &amp;a);
  private:
    static unsigned int nextId;
    unsigned int id;
};

#endif
</code></pre>
<pre><code>// test-zahl.cpp
#include &lt;iostream&gt;
#include &quot;zahl.h&quot;
using namespace std;

int main() {
  Zahl summe;
  Zahl summand;
  for (int i=0; i&lt;2; i++) {
    summe = summe + summand;
  }
  summe.ausgeben();
  return 0;
}
</code></pre>
<p>Die Klasse &quot;Zahl&quot; teilt mir nun mit, wann Objekte erzeugt, benutzt und gelöscht werden. Hier meine Ausgabe:</p>
<pre><code>Zahl Nr. 1 wurde erzeugt.
Zahl Nr. 2 wurde erzeugt.
Addiere Zahlen Nr. 1 und 2
Zahl Nr. 3 wurde erzeugt.
Zahl Nr. 3 wurde gelöscht.
Addiere Zahlen Nr. 3 und 2
Zahl Nr. 4 wurde erzeugt.
Zahl Nr. 4 wurde gelöscht.
Dies ist Zahl Nr. 4
Zahl Nr. 2 wurde gelöscht.
Zahl Nr. 4 wurde gelöscht.
</code></pre>
<p>- Zahl Nr. 1 wird nie gelöscht.<br />
- Zahl Nr. 3 wird nach dem Löschen noch einmal benutzt.<br />
- Zahl Nr. 4 wird doppelt gelöscht (und dazwischen noch ausgegeben).</p>
<p>Wie kann man dieses Beispiel verändern, damit diese Probleme nicht mehr auftreten?<br />
Ich könnte natürlich auch Zeiger verwenden und über new/delete arbeiten. Aber ist das die einzige Lösung? Oder gibt es auch ohne Zeiger eine saubere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339671/korrekte-nutzung-von-konstruktor-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 23:04:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339671.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Sep 2016 17:57:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Korrekte Nutzung von Konstruktor, Destruktor on Sun, 18 Sep 2016 17:57:06 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Da C++ Operator-Überladung erlaubt, möchte ich mit meinen Klassen &quot;rechnen&quot; können, wie mit einfachen Zahlen. Ein mathematischer Bruch wäre ein Beispiel für eine solche Klasse. In diesem Zusammenhang bekomme ich jedoch Probleme mit dem Erzeugen und Löschen von Objekten.<br />
Ich erwarte, dass bei jedem Objekt genau einmal der Destruktor aufgerufen wird, und es danach nicht mehr benutzt wird.</p>
<p>Nun habe ich eine Klasse &quot;Zahl&quot; erstellt: Ich habe den operator+ überladen, wirklich gerechnet wird aber in diesem Beispiel nichts. Es geht hier nur um das Erzeugen und Löschen der Objekte.</p>
<pre><code>// zahl.cpp
#include &quot;zahl.h&quot;
#include &lt;iostream&gt;
using namespace std;

unsigned int Zahl::nextId=1;

Zahl::Zahl() {
  id = nextId++;
  cout &lt;&lt; &quot;Zahl Nr. &quot; &lt;&lt; id &lt;&lt; &quot; wurde erzeugt.&quot; &lt;&lt; endl;
}

Zahl::Zahl(Zahl &amp;a) {
  id = nextId++;
  cout &lt;&lt; &quot;Zahl Nr. &quot; &lt;&lt; a.id &lt;&lt; &quot; wurde zu Nr. &quot; &lt;&lt; id &lt;&lt; &quot;kopiert.&quot; &lt;&lt; endl;
}

Zahl::~Zahl() {
  cout &lt;&lt; &quot;Zahl Nr. &quot; &lt;&lt; id &lt;&lt; &quot; wurde gelöscht.&quot; &lt;&lt; endl;
}

void Zahl::ausgeben() {
  cout &lt;&lt; &quot;Dies ist Zahl Nr. &quot; &lt;&lt; id &lt;&lt; endl;
}

Zahl Zahl::operator+(const Zahl &amp;a) {
  cout &lt;&lt; &quot;Addiere Zahlen Nr. &quot; &lt;&lt; id &lt;&lt; &quot; und &quot; &lt;&lt; a.id &lt;&lt; endl;
  Zahl neu;
  return neu;
}
</code></pre>
<pre><code>// zahl.h
#ifndef Zahl_H
#define Zahl_H

class Zahl {
  public:
    Zahl();
    Zahl(Zahl &amp;a);
    ~Zahl();
    void ausgeben();
    Zahl operator+(const Zahl &amp;a);
  private:
    static unsigned int nextId;
    unsigned int id;
};

#endif
</code></pre>
<pre><code>// test-zahl.cpp
#include &lt;iostream&gt;
#include &quot;zahl.h&quot;
using namespace std;

int main() {
  Zahl summe;
  Zahl summand;
  for (int i=0; i&lt;2; i++) {
    summe = summe + summand;
  }
  summe.ausgeben();
  return 0;
}
</code></pre>
<p>Die Klasse &quot;Zahl&quot; teilt mir nun mit, wann Objekte erzeugt, benutzt und gelöscht werden. Hier meine Ausgabe:</p>
<pre><code>Zahl Nr. 1 wurde erzeugt.
Zahl Nr. 2 wurde erzeugt.
Addiere Zahlen Nr. 1 und 2
Zahl Nr. 3 wurde erzeugt.
Zahl Nr. 3 wurde gelöscht.
Addiere Zahlen Nr. 3 und 2
Zahl Nr. 4 wurde erzeugt.
Zahl Nr. 4 wurde gelöscht.
Dies ist Zahl Nr. 4
Zahl Nr. 2 wurde gelöscht.
Zahl Nr. 4 wurde gelöscht.
</code></pre>
<p>- Zahl Nr. 1 wird nie gelöscht.<br />
- Zahl Nr. 3 wird nach dem Löschen noch einmal benutzt.<br />
- Zahl Nr. 4 wird doppelt gelöscht (und dazwischen noch ausgegeben).</p>
<p>Wie kann man dieses Beispiel verändern, damit diese Probleme nicht mehr auftreten?<br />
Ich könnte natürlich auch Zeiger verwenden und über new/delete arbeiten. Aber ist das die einzige Lösung? Oder gibt es auch ohne Zeiger eine saubere Möglichkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509008</guid><dc:creator><![CDATA[fuerderer]]></dc:creator><pubDate>Sun, 18 Sep 2016 17:57:06 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Nutzung von Konstruktor, Destruktor on Sun, 18 Sep 2016 18:29:03 GMT]]></title><description><![CDATA[<p>Regel der großen Drei beachten. Wenn du meinst, in einer Klasse einen selbstdefinierten Destruktor haben zu müssen, dann brauchst du auch praktisch immer mindestens noch einen selbstdefinierten Kopierkonstruktor <strong>und</strong> Zuweisungsoperator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509015</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 18 Sep 2016 18:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to Korrekte Nutzung von Konstruktor, Destruktor on Sun, 18 Sep 2016 18:50:50 GMT]]></title><description><![CDATA[<p>Vielen Dank, das Stichwort &quot;Zuweisungsoperator&quot; hat mich weiter gebracht.</p>
<p>Zur Vollständigkeit hier noch meine Lösung:<br />
Ich habe die folgende Methode in &quot;zahl.cpp&quot; ergänzt:</p>
<pre><code>Zahl &amp;Zahl::operator=(const Zahl &amp;a) {
  cout &lt;&lt; &quot;Zahl Nr. &quot; &lt;&lt; id &lt;&lt; &quot; wird gleich überschrieben und ist damit gelöscht.&quot; &lt;&lt; endl;
  id = nextId++;
  cout &lt;&lt; &quot;Zahl Nr. &quot; &lt;&lt; a.id &lt;&lt; &quot; wurde zu Nr. &quot; &lt;&lt; id &lt;&lt; &quot; kopiert.&quot; &lt;&lt; endl;
}
</code></pre>
<p>Dazu der Prototyp in der Headerdatei &quot;zahl.h&quot;:</p>
<pre><code>Zahl &amp;operator=(const Zahl &amp;a);
</code></pre>
<p>Meine Ausgabe sieht nun so aus:</p>
<pre><code>Zahl Nr. 1 wurde erzeugt.
Zahl Nr. 2 wurde erzeugt.
Addiere Zahlen Nr. 1 und 2
Zahl Nr. 3 wurde erzeugt.
Zahl Nr. 1 wird gleich überschrieben und ist damit gelöscht.
Zahl Nr. 3 wurde zu Nr. 4 kopiert.
Zahl Nr. 3 wurde gelöscht.
Addiere Zahlen Nr. 4 und 2
Zahl Nr. 5 wurde erzeugt.
Zahl Nr. 4 wird gleich überschrieben und ist damit gelöscht.
Zahl Nr. 5 wurde zu Nr. 6 kopiert.
Zahl Nr. 5 wurde gelöscht.
Dies ist Zahl Nr. 6
Zahl Nr. 2 wurde gelöscht.
Zahl Nr. 6 wurde gelöscht.
</code></pre>
<p>Damit sind die Probleme gelöst. Auf jedem Objekt wird genau ein Mal der Destruktor aufgerufen und das Objekt danach nicht mehr benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509020</guid><dc:creator><![CDATA[fuerderer]]></dc:creator><pubDate>Sun, 18 Sep 2016 18:50:50 GMT</pubDate></item></channel></rss>