<?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[Merkwürdiger Fehler, vielleicht liegts am Konstruktor?]]></title><description><![CDATA[<p>Moin zusammen</p>
<p>Ich sitze zur Zeit an Konstruktoren, Vererbung und dem new/delete-Befehl. Ich hatte eigentlich gedacht, dass ich das nun recht gut verstehen würde, aber das war wohl eine Fehlinformation meinerseits.<br />
Folgendes Problem:<br />
Ich habe zwei Raumschiffe Schiff und Minenleger. Letzterer soll von ersterem Erben, aber beide sollen auch eigenständige Schiffe und somit &quot;baubar&quot; sein. Das lief bis zu dem Punkt auch ganz gut, bis ich eine zeigeDaten-Funktion eingebaut habe, die schlichterweise die einzelnen Daten zu den jeweiligen Schiffen ausgeben soll.<br />
Im Hauptteil des Programmes soll gefragt werden, wie viele Schiffe und wie viele Minenleger gebaut werden sollen. Die entsprechende Menge soll per new-Befehl angelegt werden. In der for-Schleife soll nun jedes Schiff/jeder Minenleger durchlaufen werden. Bis auf die zeigeDaten-Funktion des letzten Schiffes/Minenlegers funktionieren die Sachen auch wirklich klasse.</p>
<p>Hier mal der Code:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class CRaumschiff
{
protected:
	int m_Farbe;
	int m_Energie;
public:
	CRaumschiff ()
	{
		m_Farbe =0;
		m_Energie = 1000;
		cout &lt;&lt; &quot;Raumschiff wurde erstellt!&quot; &lt;&lt; endl;
	}

	void Starten () {cout &lt;&lt; &quot;Startete!&quot; &lt;&lt; endl;}
	void Landen () {cout &lt;&lt; &quot;Landete!&quot; &lt;&lt; endl;} 
	void zeigeDaten ()
	{
		cout &lt;&lt; &quot;Farbe: &quot; &lt;&lt; m_Farbe &lt;&lt; endl;
		cout &lt;&lt; &quot;Energie: &quot; &lt;&lt; m_Energie &lt;&lt; endl;
	}
};

class CMinenleger : public CRaumschiff
{
private:
	int m_Minen;
public:
	CMinenleger ()
	{
		m_Minen = 9;
		m_Farbe = 2;
		m_Energie = 600;
	}
	void lege_Mine () {cout &lt;&lt; &quot;Mine wurde gelegt! Es sind noch &quot; &lt;&lt; m_Minen &lt;&lt; &quot; Minen uebrig!&quot; &lt;&lt; endl;}
	void Starten () {cout &lt;&lt; &quot;Minenleger gestartet!&quot; &lt;&lt; endl;}
	void Landen () {cout &lt;&lt; &quot;Minenleger gelandet!&quot; &lt;&lt; endl;}
};

int main ()
{
	CRaumschiff *Schiff = NULL;
	CMinenleger *Miner = NULL;
	int schiffmenge;
	int minermenge;

	cout &lt;&lt; &quot;Wie viele Schiffe soll ich bauen?&quot; &lt;&lt; endl;
	cin &gt;&gt; schiffmenge;

	Schiff = new CRaumschiff[schiffmenge];
	for (int i=1; i &lt;= schiffmenge; i++)
	{
		cout &lt;&lt; &quot;Schiff Nr. &quot; &lt;&lt; i &lt;&lt; endl;
		Schiff[i].Starten ();
		Schiff[i].Landen();
		Schiff[i].zeigeDaten();
		cout &lt;&lt; endl;
	}

	cout &lt;&lt; &quot;Wie viele Miner soll ich bauen?&quot; &lt;&lt; endl;
	cin &gt;&gt; minermenge;

	Miner = new CMinenleger [minermenge];
	for (int i=1; i &lt;= minermenge; i++)
	{
		cout &lt;&lt; &quot;Miner Nr. &quot; &lt;&lt; i &lt;&lt; endl;
		Miner[i].Starten();
		Miner[i].lege_Mine();
		Miner[i].Landen();
		Miner[i].zeigeDaten();
		cout &lt;&lt; endl;
	}

	delete [] Miner;
	delete [] Schiff;

	Miner = NULL;
	Schiff = NULL;
	return 0;
}
</code></pre>
<p>Egal, wie viele Schiffe oder Minenleger man bauen lässt, die Daten des jeweils letzten sehen aus, wie durch den Fleischwolf gedreht.<br />
Beispiel:<br />
Ich baue drei Schiffe.<br />
Schiff 1 sieht gut aus. Schiff zwei sieht gut aus. Schiff drei hat auf ein Mal Farbe -33686019 und Energie 0.<br />
Ich baue 4 Minenleger.<br />
Bis auf das letzte: Alles klappt. Aber Minenleger vier schleudert mir folgendes entgegen:<br />
Es sind noch 255107023 Minen übrig, Farbe -33686019, Energie: -572662307.<br />
Das ließt sich, als wären alle Minen auf ein Mal in die Luft gegangen.</p>
<p>Kann mir jemand von euch erklären, warum das Programm so spannende Werte liefert? (Und worin mein Fehler liegt, dass dieses Programm meint, soetwas tun zu müssen?)</p>
<p>Ich würde mich wirklich sehr über Antworten freuen <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>(Für diejenigen, denen Teile des Codes bekannt vorkommen: Ich arbeite mich durch &quot;C++ für Spieleprogrammierer&quot; durch)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296976/merkwürdiger-fehler-vielleicht-liegts-am-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 15:24:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296976.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Dec 2011 11:56:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 11:56:11 GMT]]></title><description><![CDATA[<p>Moin zusammen</p>
<p>Ich sitze zur Zeit an Konstruktoren, Vererbung und dem new/delete-Befehl. Ich hatte eigentlich gedacht, dass ich das nun recht gut verstehen würde, aber das war wohl eine Fehlinformation meinerseits.<br />
Folgendes Problem:<br />
Ich habe zwei Raumschiffe Schiff und Minenleger. Letzterer soll von ersterem Erben, aber beide sollen auch eigenständige Schiffe und somit &quot;baubar&quot; sein. Das lief bis zu dem Punkt auch ganz gut, bis ich eine zeigeDaten-Funktion eingebaut habe, die schlichterweise die einzelnen Daten zu den jeweiligen Schiffen ausgeben soll.<br />
Im Hauptteil des Programmes soll gefragt werden, wie viele Schiffe und wie viele Minenleger gebaut werden sollen. Die entsprechende Menge soll per new-Befehl angelegt werden. In der for-Schleife soll nun jedes Schiff/jeder Minenleger durchlaufen werden. Bis auf die zeigeDaten-Funktion des letzten Schiffes/Minenlegers funktionieren die Sachen auch wirklich klasse.</p>
<p>Hier mal der Code:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class CRaumschiff
{
protected:
	int m_Farbe;
	int m_Energie;
public:
	CRaumschiff ()
	{
		m_Farbe =0;
		m_Energie = 1000;
		cout &lt;&lt; &quot;Raumschiff wurde erstellt!&quot; &lt;&lt; endl;
	}

	void Starten () {cout &lt;&lt; &quot;Startete!&quot; &lt;&lt; endl;}
	void Landen () {cout &lt;&lt; &quot;Landete!&quot; &lt;&lt; endl;} 
	void zeigeDaten ()
	{
		cout &lt;&lt; &quot;Farbe: &quot; &lt;&lt; m_Farbe &lt;&lt; endl;
		cout &lt;&lt; &quot;Energie: &quot; &lt;&lt; m_Energie &lt;&lt; endl;
	}
};

class CMinenleger : public CRaumschiff
{
private:
	int m_Minen;
public:
	CMinenleger ()
	{
		m_Minen = 9;
		m_Farbe = 2;
		m_Energie = 600;
	}
	void lege_Mine () {cout &lt;&lt; &quot;Mine wurde gelegt! Es sind noch &quot; &lt;&lt; m_Minen &lt;&lt; &quot; Minen uebrig!&quot; &lt;&lt; endl;}
	void Starten () {cout &lt;&lt; &quot;Minenleger gestartet!&quot; &lt;&lt; endl;}
	void Landen () {cout &lt;&lt; &quot;Minenleger gelandet!&quot; &lt;&lt; endl;}
};

int main ()
{
	CRaumschiff *Schiff = NULL;
	CMinenleger *Miner = NULL;
	int schiffmenge;
	int minermenge;

	cout &lt;&lt; &quot;Wie viele Schiffe soll ich bauen?&quot; &lt;&lt; endl;
	cin &gt;&gt; schiffmenge;

	Schiff = new CRaumschiff[schiffmenge];
	for (int i=1; i &lt;= schiffmenge; i++)
	{
		cout &lt;&lt; &quot;Schiff Nr. &quot; &lt;&lt; i &lt;&lt; endl;
		Schiff[i].Starten ();
		Schiff[i].Landen();
		Schiff[i].zeigeDaten();
		cout &lt;&lt; endl;
	}

	cout &lt;&lt; &quot;Wie viele Miner soll ich bauen?&quot; &lt;&lt; endl;
	cin &gt;&gt; minermenge;

	Miner = new CMinenleger [minermenge];
	for (int i=1; i &lt;= minermenge; i++)
	{
		cout &lt;&lt; &quot;Miner Nr. &quot; &lt;&lt; i &lt;&lt; endl;
		Miner[i].Starten();
		Miner[i].lege_Mine();
		Miner[i].Landen();
		Miner[i].zeigeDaten();
		cout &lt;&lt; endl;
	}

	delete [] Miner;
	delete [] Schiff;

	Miner = NULL;
	Schiff = NULL;
	return 0;
}
</code></pre>
<p>Egal, wie viele Schiffe oder Minenleger man bauen lässt, die Daten des jeweils letzten sehen aus, wie durch den Fleischwolf gedreht.<br />
Beispiel:<br />
Ich baue drei Schiffe.<br />
Schiff 1 sieht gut aus. Schiff zwei sieht gut aus. Schiff drei hat auf ein Mal Farbe -33686019 und Energie 0.<br />
Ich baue 4 Minenleger.<br />
Bis auf das letzte: Alles klappt. Aber Minenleger vier schleudert mir folgendes entgegen:<br />
Es sind noch 255107023 Minen übrig, Farbe -33686019, Energie: -572662307.<br />
Das ließt sich, als wären alle Minen auf ein Mal in die Luft gegangen.</p>
<p>Kann mir jemand von euch erklären, warum das Programm so spannende Werte liefert? (Und worin mein Fehler liegt, dass dieses Programm meint, soetwas tun zu müssen?)</p>
<p>Ich würde mich wirklich sehr über Antworten freuen <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>(Für diejenigen, denen Teile des Codes bekannt vorkommen: Ich arbeite mich durch &quot;C++ für Spieleprogrammierer&quot; durch)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2157629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157629</guid><dc:creator><![CDATA[Nayamis]]></dc:creator><pubDate>Fri, 16 Dec 2011 11:56:11 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 12:42:01 GMT]]></title><description><![CDATA[<p>Arrays in C++ sind nullbasiert! Dein erstes Schiff hat also den Index 0, dein drittes den Index 2.</p>
<p>Statt</p>
<pre><code class="language-cpp">for (int i=1; i &lt;= schiffmenge; i++)
</code></pre>
<p>probier mal so:</p>
<pre><code class="language-cpp">for (int i=0; i &lt; schiffmenge; i++)
</code></pre>
<p>Btw, std::vector würde dir die manuelle Speicherverwaltung abnehmen. Dann könntest du z.B. kein delete[] vergessen (std::vector räumt selber auf). Außerdem hättest du den Fehler vermutlich selbst gefunden (da hättest du dann eine Fehlermeldung bekommen, &quot;vector subscript out of range&quot; oder so). Schau dir die Klasse ruhig mal an. Ist wesentlich komfortabler als rohe Arrays.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2157631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157631</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 16 Dec 2011 12:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 12:01:22 GMT]]></title><description><![CDATA[<p>1. Arrays gehen von 0 los. Du bist also immer eines daneben und der letzte ist daher irgendwas über den Grenzen der Arrays.<br />
2. Wenn man new[] benutzt, ist das auf jeden Fall sehr suboptimal, denn es ist bloß std::vector ohne dessen Vorteile.</p>
<p>edit: Zu langsam...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2157633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157633</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 16 Dec 2011 12:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 12:39:16 GMT]]></title><description><![CDATA[<p>Dankeschön :D!<br />
Jemine, sobald ich mich an etwas Neuem versuche, vergesse ich jedes Mal, dass Arrays auf 0 beginnen. An meinem &quot;Hauptrechner&quot; habe ich mir schon ein großes, gelbes Post-It deswegen geklebt...<br />
Danke euch beiden, nun funktioniert es.</p>
<p>std::vector klingt interessant, das werde ich mir ansehen. Danke für den Tipp <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/2157657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157657</guid><dc:creator><![CDATA[Nayamis]]></dc:creator><pubDate>Fri, 16 Dec 2011 12:39:16 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 13:14:16 GMT]]></title><description><![CDATA[<p>Nachdem das wichtigste gesagt wurde: Warum beginnt dein Klassenname mit C?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2157679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157679</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 16 Dec 2011 13:14:16 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 13:38:00 GMT]]></title><description><![CDATA[<p>1. Weils eine Class ist und ich mir das irgendwie angewöhnt habe, da<br />
2. Mein Buch sagt, ich soll das machen <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="😉"
    /> (Und solange ich noch am Üben bin, halte ich mich gerne an Vorgaben. Das macht das Vergleichen von Code irgendwie einfacher)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2157697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157697</guid><dc:creator><![CDATA[Nayamis]]></dc:creator><pubDate>Fri, 16 Dec 2011 13:38:00 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 13:46:06 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Nachdem das wichtigste gesagt wurde: Warum beginnt dein Klassenname mit C?</p>
</blockquote>
<p>Das ist immer noch Ansichts- bzw. Geschmackssache. Das VS unterstützt das sogar teilweise atkiv.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2157703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157703</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 16 Dec 2011 13:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 13:57:33 GMT]]></title><description><![CDATA[<p>Welches Buch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2157713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157713</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 16 Dec 2011 13:57:33 GMT</pubDate></item><item><title><![CDATA[Reply to Merkwürdiger Fehler, vielleicht liegts am Konstruktor? on Fri, 16 Dec 2011 14:22:49 GMT]]></title><description><![CDATA[<p>Siehe oben: &quot;C++ für Spieleprogrammierer&quot; <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/2157732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2157732</guid><dc:creator><![CDATA[Nayamis]]></dc:creator><pubDate>Fri, 16 Dec 2011 14:22:49 GMT</pubDate></item></channel></rss>