<?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[Instanzen einer Klasse nutzen gleichen internen Zeiger]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Klasse definiert:</p>
<pre><code class="language-cpp">class turm
{
    int *pturm;         			// Zeiger auf turm-Objekt
    int index;           		  	// turmindex, oberste Scheibe +1
    int hoehe;               	  	// Turmgrösse

  public:
    bool push(const int val);     	// Schreibe auf Turm ablegen
    int pop();                    	// Scheibe vom turm holen
    void druck(void);             	// Methode zur Ausgabe des Turms
    turm(int s=4);                	// Konstruktor, Standard-Turmgrösse 4
    ~turm();                      	// Destruktor (Speicher freigeben)
};

turm::turm(int s)
{
    pturm = new int[s];				// Datenfeld reservieren
    index = 0;                    	// Index initialisieren
    hoehe = s;                    	// Höhe merken
}
</code></pre>
<p>Über den Konstruktor habe ich 3 Instanzen dieser Klasse erzeugt. Beim debuggen ist mir aufgefallen, dass der Pointer *pturm aller 3 Instanzen auf die gleiche Speicheradresse zeigen. Eigentlich sollte aber jede Instanz ihr eigenes Feld und einen eigenen Pointer haben. Was hab ich falsch gemacht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title="=("
      alt="😞"
    /><br />
Danke schon im Vorraus.</p>
<p>Ich hab diese Frage in keinem anderen Forum gestellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/298149/instanzen-einer-klasse-nutzen-gleichen-internen-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 01:28:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/298149.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Jan 2012 14:01:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 14:01:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Klasse definiert:</p>
<pre><code class="language-cpp">class turm
{
    int *pturm;         			// Zeiger auf turm-Objekt
    int index;           		  	// turmindex, oberste Scheibe +1
    int hoehe;               	  	// Turmgrösse

  public:
    bool push(const int val);     	// Schreibe auf Turm ablegen
    int pop();                    	// Scheibe vom turm holen
    void druck(void);             	// Methode zur Ausgabe des Turms
    turm(int s=4);                	// Konstruktor, Standard-Turmgrösse 4
    ~turm();                      	// Destruktor (Speicher freigeben)
};

turm::turm(int s)
{
    pturm = new int[s];				// Datenfeld reservieren
    index = 0;                    	// Index initialisieren
    hoehe = s;                    	// Höhe merken
}
</code></pre>
<p>Über den Konstruktor habe ich 3 Instanzen dieser Klasse erzeugt. Beim debuggen ist mir aufgefallen, dass der Pointer *pturm aller 3 Instanzen auf die gleiche Speicheradresse zeigen. Eigentlich sollte aber jede Instanz ihr eigenes Feld und einen eigenen Pointer haben. Was hab ich falsch gemacht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title="=("
      alt="😞"
    /><br />
Danke schon im Vorraus.</p>
<p>Ich hab diese Frage in keinem anderen Forum gestellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168008</guid><dc:creator><![CDATA[Mephi]]></dc:creator><pubDate>Sat, 14 Jan 2012 14:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 14:05:19 GMT]]></title><description><![CDATA[<p>1. Wenn du einen nichttrivialen Destruktor hast, willst du fast immer auch einen eigenen Kopierkonstruktor und Zuweisungsoperator. So auch hier. Stichwort: Regel der großen Drei.<br />
2. Es gibt nie einen Grund, new[] einem vector vorzuziehen. So auch hier.<br />
3. Wenn du 2. anwendest, entfällt 1.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168010</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 14 Jan 2012 14:05:19 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 14:05:55 GMT]]></title><description><![CDATA[<p>Zeig mal den Code, in dem du die Klasse instanziierst und diese Beobachtung machst. Übrigens fehlen Kopierkonstruktor und Kopier-Zuweisungsoperator, vielleicht ist es das ja schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168011</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 14 Jan 2012 14:05:55 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 15:37:50 GMT]]></title><description><![CDATA[<p>Außerdem: Wenn Du einen Konstruktor mit einem Element aufrufen kannst und es handelt sich dabei nicht um den Kopierkonstukter, dann solltest Du mal darüber nachdenken, ob er nicht <code>explizit</code> sein sollte; denn sonst kann Dir folgendes passieren:</p>
<pre><code class="language-cpp">void foo(turm);

int main() {
  foo(9); // oops! das kompiliert ja! darf das so?
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2168035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168035</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 14 Jan 2012 15:37:50 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 15:48:42 GMT]]></title><description><![CDATA[<p>Im Weiteren:</p>
<ul>
<li><code>const int</code> bringt in der Funktionsdeklaration von <code>push()</code> nichts, nimm einfach <code>int</code> .</li>
<li><code>void</code> in Parameterlisten ist in C++ unüblich. Wenn du es dennoch machen willst, dann überall...</li>
<li>Benutze die Initialisierungsliste, um Member im Konstruktor zu initialisieren.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2168039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168039</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 14 Jan 2012 15:48:42 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 17:22:18 GMT]]></title><description><![CDATA[<p>Wenn du einen Zeiger (pointergefummel ist übrigens nicht sexy) in deiner Klasse hast, wird nicht der Pointee sondern der Pointer selbst kopiert (wenn die Klasse kopiert wird). :xmas1:</p>
<p>Edit: gerade stand da: zuletzt bearbeitet von Hacker ... . Ich hab überhaupt nichts bearbeitet.<br />
Edit²:<br />
Viel schöner wär da doch ein <strong>stack&lt;int&gt;, bzw. stack&lt;Scheibe&gt;.</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168063</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 14 Jan 2012 17:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 18:55:31 GMT]]></title><description><![CDATA[<p>Danke erstmal für die vielen Antworten. Ich hab meinen Code entsprechend überarbeitet.</p>
<p>Vector und Stack fallen leider raus, da ich die Methoden pop und push selbst implementieren soll. Das ist auch alles fertig nur das Integerfeld macht mir Ärger.</p>
<p>Kopierkonstruktor kannte ich vorher noch garnicht, bin noch recht neu in C++. Soweit ich das verstanden habe, ist der ja aber nur dafür da, ein Objekt vom Typ Turm in ein neues Objekt zu kopieren. Das will ich ja aber garnicht machen. Im Gegenteil ich möchte die möglichst getrennt haben. Brauch ich den troztdem?</p>
<p>Bashar wollte ja noch die Initialisierung sehen:</p>
<pre><code class="language-cpp">int main()
{
    turm t1,t2,t3;                 		// Typdeklaration der Türme
    int anzahl,i;

    cin &gt;&gt; anzahl;

    t1=turm(anzahl);               		// initialisieren von Turm1
    t2=turm(anzahl);               		// initialisieren von Turm2
    t3=turm(anzahl);               		// initialisieren vonTurm3
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2168094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168094</guid><dc:creator><![CDATA[Mephi]]></dc:creator><pubDate>Sat, 14 Jan 2012 18:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 19:31:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Kopierkonstruktor kannte ich vorher noch garnicht, bin noch recht neu in C++. Soweit ich das verstanden habe, ist der ja aber nur dafür da, ein Objekt vom Typ Turm in ein neues Objekt zu kopieren. Das will ich ja aber garnicht machen.</p>
</blockquote>
<p>Doch, den Kopierkonstruktor brauchst du ganz oft, du siehst es nur meistens nicht. Was meinst du, was zum Beispiel passiert, wenn du ein Objekt an eine Funktion übergibst? Ebenso der Zuweisungsoperator, den du sogar direkt 3x benutzt.</p>
<p>Die folgenden drei Aussagen können nicht gleichzeitig wahr sein:<br />
1.</p>
<p>Mephi schrieb:</p>
<blockquote>
<p>da ich die Methoden pop und push selbst implementieren soll.</p>
</blockquote>
<p>2.</p>
<blockquote>
<p>Kopierkonstruktor kannte ich vorher noch garnicht</p>
</blockquote>
<p>3. Das wird was.</p>
<p>Sicher, dass du deine Aufgabe richtig verstanden hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168099</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 14 Jan 2012 19:31:11 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 19:28:49 GMT]]></title><description><![CDATA[<p>Mephi schrieb:</p>
<blockquote>
<p>Bashar wollte ja noch die Initialisierung sehen:</p>
<pre><code class="language-cpp">t1=turm(anzahl);               		// initialisieren von Turm1
</code></pre>
</blockquote>
<p>Das ist keine Initialisierung, sondern eine Zuweisung.</p>
<p>Zuerst wird der Ausdruck auf der rechten Seite ausgewertet, das ist die Erzeugung eines temporären Objektes mithilfe des Konstruktors. Dann wird dieses an das Objekt auf der linken Seite zugewiesen. Dazu wird der Zuweisungsoperator benutzt. Da du den nicht implementiert hast, bastelt sich der Compiler selber einen, der einfach nur die Member des Objektes einzeln zuweist -- auch den Zeiger. Dann wird das temporäre Objekt zerstört.</p>
<p>Das ganze wiederholt sich noch zweimal. Da das temporäre Objekt jeweils zerstört wird, ist es ganz plausibel, dass bei der nächsten Erzeugung im Konstruktor das new wieder den gleichen Zeiger wie beim letzten mal zurückliefert.</p>
<p>Am Ende müsste das Programm abstürzen, weil deine turm-Variablen ja auch zerstört werden und immer wieder den gleichen Zeiger deleten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168101</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 14 Jan 2012 19:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 20:00:49 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a>: Nach deiner Erklärung macht es noch weniger Sinn, dass alle drei Türme den gleichen Zeiger bekommen. Die anderen Elemente der Klasse werden auch separat initialisiert und überschreiben sich nicht gegenseitig.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3822">@Sepp</a>: Kannst du mir bei dem Kopierkontruktor helfen? Ich würde gerne testen, ob der das Problem löst. Ich hab verschiedene Notationen probiert, aber bekomm die anzahl nicht übergeben. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title="=/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168106</guid><dc:creator><![CDATA[Mephi]]></dc:creator><pubDate>Sat, 14 Jan 2012 20:00:49 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 20:24:51 GMT]]></title><description><![CDATA[<p>Mit Probieren alleine kommst Du in C++ nicht weit!</p>
<p>Mephi, wenn Du da links vom Gleichheitszeichen schon ein „fertiges“ Objekt und rechts sowas wie Typ(parameter) stehen hast, dann wird wegen der rechten Seite ein TEMPORÄRES Typ-Objekt erzeugt/initialisiert und dessen Elemente elementweise in das Objekt auf der linken Seite kopiert (da Du ja keinen eigenen Zuweisungsoperator definierst). „Elemente“ bezieht sich auf pturm, index und hoehe in deinem Fall. Du hast also zwischendurch zwei Turm-Objekte, die auf dasselbe Array zeigen. Ein temporäres und t1. Danach wird das temporäre Objekt zerstört (quasi beim Semikolon). Dessen Destruktor gibt aber das Array wieder frei und t1 zeigt auf ungültigen Speicher! Das ist eine klassische Verletzung der Dreierregel. Wenn Du Türme sowieso nicht kopieren und zuweisen willst, kannst Du das auch explizit verbieten, statt dem Compiler solche Operationen zu überlassen:</p>
<pre><code class="language-cpp">class Turm
{
private:
  Turm(Turm const&amp;); // copy ctor
  Turm&amp; operator=(Turm const&amp;); // copy assign
  …
public:
  …
}
</code></pre>
<p>Copy ctor und copy assign werden privat deklariert und bleiben undefiniert. Solltest Du dann versehentlich versuchen ein Turm-Objekt zu kopieren oder einem anderen zuzuweisen, wird der Compiler (spätestens der Linker) Dir das anmeckern…</p>
<p>Hast Du schon Erfahrungen mit anderen Programmiersprachen, die Dich hier durcheinander bringen und bei Dir falsche Erwartungen erzeugen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168117</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 14 Jan 2012 20:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzen einer Klasse nutzen gleichen internen Zeiger on Sat, 14 Jan 2012 21:00:57 GMT]]></title><description><![CDATA[<p>Drüber nachgedacht -&gt; gegrübelt -&gt; probiert -&gt; hinbekommen -&gt; funktioniert</p>
<p>... eigentlich ganz einfach wenn mans erstmal kapiert hat ... so schwer war das jetzt mit dem kopierkonstruktor garnicht -.-' *shy*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2168141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2168141</guid><dc:creator><![CDATA[Mephi]]></dc:creator><pubDate>Sat, 14 Jan 2012 21:00:57 GMT</pubDate></item></channel></rss>