<?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[dynamische Objekte Teil 2]]></title><description><![CDATA[<p>Sorry, aber ich bin schon wieder mit meinem Latein am Ende...<br />
Nach meiner Frage gestern, habe ich heute ein weiteres Problem mit dynamischen Objekten.</p>
<p>Ich habe folgende Vererbungsstruktur</p>
<pre><code class="language-cpp">class Particle                           // Attribute double x,y,z
class Atom : virtual public Particle     // zus. const string &amp;chemElement
class Molecule : virtual public Particle // zus. Atom* atoms, int n_atoms
</code></pre>
<p>und folgendes Beispielprogramm:</p>
<pre><code class="language-cpp">int main()
{
	Particle **P = new Particle*[12];

	for (int i = 0; i &lt; n_P; i++) // Initialisierung der Particle
	{
		double x = 1;
		double y = 2;
		double z = 3;
		Atom atoms[2];
		atoms[0] = Atom(x,y,z, &quot;H2&quot;);
		atoms[1] = Atom(x,y,z, &quot;O&quot;);
		P[i] = new Molecule (x,y,z, atoms, 2);
         }

	// Ausgabe der Particle
	for (i = 0; i &lt; n_P; i++)
	{
		cout &lt;&lt; P[i]-&gt;toString() &lt;&lt; &quot;\n&quot;;
	}

	return 0;
}
</code></pre>
<p>Die Elementfunktion toString() sieht im Fall von Molecule so aus:</p>
<pre><code class="language-cpp">std::string Molecule::toString()
{
    std::ostringstream os;
    os &lt;&lt; &quot;Molecule (&quot;;
    for (int i = 0; i &lt; n_atoms; i++)
    {
	os &lt;&lt; atoms[i].toString() &lt;&lt; &quot; &quot;;
    }
    os &lt;&lt; &quot;)&quot;;
    return os.str();
}
</code></pre>
<p>Bei der Ausgabe der Particle wird nun in der Anweisung</p>
<pre><code class="language-cpp">atoms[i].toString() //siehe Molecule::toString()
</code></pre>
<p>nicht die zur Klasse Atom gehörende Elementfuktion toString aufgerufen, sondern die der Basisklasse Particle.<br />
Wenn ich in main aber schreibe:</p>
<pre><code class="language-cpp">Atom* atoms = new Atom[2]; // anstatt Atom atoms[2];
</code></pre>
<p>funktioniert es. Und das verstehe ich nicht...</p>
<p>Hoffe, das war genug Text, um das Problem zu verstehen und nicht zu viel, um beim lesen müde zu werden ;).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/128031/dynamische-objekte-teil-2</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 07:24:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/128031.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Nov 2005 18:28:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dynamische Objekte Teil 2 on Tue, 29 Nov 2005 18:28:49 GMT]]></title><description><![CDATA[<p>Sorry, aber ich bin schon wieder mit meinem Latein am Ende...<br />
Nach meiner Frage gestern, habe ich heute ein weiteres Problem mit dynamischen Objekten.</p>
<p>Ich habe folgende Vererbungsstruktur</p>
<pre><code class="language-cpp">class Particle                           // Attribute double x,y,z
class Atom : virtual public Particle     // zus. const string &amp;chemElement
class Molecule : virtual public Particle // zus. Atom* atoms, int n_atoms
</code></pre>
<p>und folgendes Beispielprogramm:</p>
<pre><code class="language-cpp">int main()
{
	Particle **P = new Particle*[12];

	for (int i = 0; i &lt; n_P; i++) // Initialisierung der Particle
	{
		double x = 1;
		double y = 2;
		double z = 3;
		Atom atoms[2];
		atoms[0] = Atom(x,y,z, &quot;H2&quot;);
		atoms[1] = Atom(x,y,z, &quot;O&quot;);
		P[i] = new Molecule (x,y,z, atoms, 2);
         }

	// Ausgabe der Particle
	for (i = 0; i &lt; n_P; i++)
	{
		cout &lt;&lt; P[i]-&gt;toString() &lt;&lt; &quot;\n&quot;;
	}

	return 0;
}
</code></pre>
<p>Die Elementfunktion toString() sieht im Fall von Molecule so aus:</p>
<pre><code class="language-cpp">std::string Molecule::toString()
{
    std::ostringstream os;
    os &lt;&lt; &quot;Molecule (&quot;;
    for (int i = 0; i &lt; n_atoms; i++)
    {
	os &lt;&lt; atoms[i].toString() &lt;&lt; &quot; &quot;;
    }
    os &lt;&lt; &quot;)&quot;;
    return os.str();
}
</code></pre>
<p>Bei der Ausgabe der Particle wird nun in der Anweisung</p>
<pre><code class="language-cpp">atoms[i].toString() //siehe Molecule::toString()
</code></pre>
<p>nicht die zur Klasse Atom gehörende Elementfuktion toString aufgerufen, sondern die der Basisklasse Particle.<br />
Wenn ich in main aber schreibe:</p>
<pre><code class="language-cpp">Atom* atoms = new Atom[2]; // anstatt Atom atoms[2];
</code></pre>
<p>funktioniert es. Und das verstehe ich nicht...</p>
<p>Hoffe, das war genug Text, um das Problem zu verstehen und nicht zu viel, um beim lesen müde zu werden ;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930046</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 29 Nov 2005 18:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Objekte Teil 2 on Tue, 29 Nov 2005 18:32:25 GMT]]></title><description><![CDATA[<p>Du musst die Methode in der Basisklasse <em>virtual</em> machen. Eine Verbung die virtual ist, heißt NICHT dass alle Methoden &quot;virtuell&quot; vererbt werden. -&gt; Stichwort Polymorphie.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930050</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Tue, 29 Nov 2005 18:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Objekte Teil 2 on Tue, 29 Nov 2005 18:34:03 GMT]]></title><description><![CDATA[<p>FireFlow schrieb:</p>
<blockquote>
<p>Du musst die Methode in der Basisklasse <em>virtual</em> machen. Eine Verbung die virtual ist, heißt NICHT dass alle Methoden &quot;virtuell&quot; vererbt werden. -&gt; Stichwort Polymorphie.</p>
<p>Gruß</p>
</blockquote>
<p>...ist in der Basisklasse virtual.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930051</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 29 Nov 2005 18:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Objekte Teil 2 on Tue, 29 Nov 2005 20:26:00 GMT]]></title><description><![CDATA[<p>Nanuq schrieb:</p>
<blockquote>
<p>...ist in der Basisklasse virtual.</p>
</blockquote>
<p>Deshalb musst du nicht virtuell vererben. Momentan würde das nur Sinn machen, wenn du eine Klasse hast, die sowohl von Atom als auch Molecule erbt. Sinnvoll ist sowas imo nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930166</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 29 Nov 2005 20:26:00 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Objekte Teil 2 on Tue, 29 Nov 2005 20:42:26 GMT]]></title><description><![CDATA[<p>...damit nicht mehrere Subojekte von Particle in einer von Molecule und Atom abgeleiteten Klasse entstünden.<br />
Ist noch recht neu für mich, da kommt es schon mal zu solchen Unsicherheiten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> .</p>
<p>An meiner eigentlichen Frage ändert es aber trotzdem nichts. Ich verstehe nicht, was es hier für einen Unterschied macht, ob ich</p>
<pre><code class="language-cpp">Atom atoms[2];
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">Atom* atoms = new Atom[2];
</code></pre>
<p>schreibe.<br />
Ist nicht der Zeiger, den ich (innerhalb des selben Blocks)</p>
<pre><code class="language-cpp">P[i] = new Molecule (x,y,z, atoms, 2);
</code></pre>
<p>übergebe, in beiden Fällen derselbe?</p>
<p>(Übrigens stammt die komplette Aufgabe von hier: <a href="http://www.lrz-muenchen.de/~ebner/C++/Uebung/aufgaben_004.html" rel="nofollow">http://www.lrz-muenchen.de/~ebner/C++/Uebung/aufgaben_004.html</a> . Dort enthält die Aufgabenstellung genau diesen &quot;Fehler&quot;, während er - leider ohne Erklärung :(- im Lösungsvorschlag korrigiert ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930182</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 29 Nov 2005 20:42:26 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Objekte Teil 2 on Tue, 29 Nov 2005 21:05:18 GMT]]></title><description><![CDATA[<p>Im ersten Fall ist atoms ein Array auf dem Stack der Funktion, der seine Gültigkeit beim &quot;}&quot; der for-Schleife verliert (wenn Du in new Molecule nur den Zeiger übernimmst), demzufolge dürften alle deine Moleküle auf dieselben beiden Atome verweisen, die immer wieder initialisiert werden (und selbst das ist unvorhersehbar)...</p>
<p>Im zweiten Fall erzeugst Du jedesmal ein neues Paar Atome auf dem Heap und übernimmst es in dein Molekül, was schonmal zumindest korrekt und überdies sauberer ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>EDIT: Achja, während ersteres beim &quot;}&quot; seine Gültigkeit verliert muss zweiteres natürlich irgendwo aufgeräumt werden mittels delete[] <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/930195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930195</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 29 Nov 2005 21:05:18 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Objekte Teil 2 on Tue, 29 Nov 2005 21:16:55 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10879">@Nanuq</a><br />
Technisch besteht der Unterschied nur darin, dass einmal automatischer Speicher und einmal Freispeicher verwendet wird. Praktisch bedeutet das, dass beide Objektarrays gleichermassen benutzt werden können. Bei der dynamischen Version muss jedoch noch manuell delete[] aufgerufen werden. Sofern du in Molecule Kopien der Atome erzeugst, sollte es so problemlos funktionieren.<br />
Ansonsten kann ich dein Problem ehrlich gesagt nicht nachvollziehen. Zeig mal Deklaration und Definition von Particle::toString und Atom::toString.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930210</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 29 Nov 2005 21:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Objekte Teil 2 on Tue, 29 Nov 2005 21:27:59 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Zeig mal Deklaration und Definition von Particle::toString und Atom::toString</p>
</blockquote>
<pre><code class="language-cpp">std::string Particle::toString()
{
	std::ostringstream os;
    os &lt;&lt; &quot;Particle [&quot; &lt;&lt; std::setprecision(3) &lt;&lt; x &lt;&lt; &quot;,&quot; &lt;&lt; y &lt;&lt; &quot;,&quot; &lt;&lt; z &lt;&lt; &quot;]&quot;;
    return os.str();
}

std::string Atom::toString()
{
	std::ostringstream os;
    os &lt;&lt; &quot;Atom &quot; &lt;&lt; chemElement;
    return os.str();
}
</code></pre>
<p>Aber ich denke, ich habe es schon begriffen. Wenn ich mir in Molecule nur die Zeiger merke anstatt Kopien der Werte zu erstellen, ist die Information bei } verloren. Wenn ich z.B. die Ausgabe noch vor dem Ende des Blocks (innerhalb der Schleife) durchführe funktioniert es ebenfalls.<br />
Prinzipiell ist mir die Sache mit Stack und Heap sowie new und delete schon klar, denke ich, allerdings schleichen sich bei der Anwendung doch immer wieder Denkfehler ein.<br />
Naja, Übung macht den Meister <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Danke jedenfalls euch beiden!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930222</guid><dc:creator><![CDATA[Nanuq]]></dc:creator><pubDate>Tue, 29 Nov 2005 21:27:59 GMT</pubDate></item></channel></rss>