<?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[Frage zu OOP]]></title><description><![CDATA[<p>Guten Tag,<br />
Ich versuche mich gerade an einem Schiffe versenken in der Konsole(ohne KI).<br />
Ich habe mir dazu erstmal diese Klasse geschrieben:</p>
<pre><code>#include &quot;Grid.h&quot;

Grid::Grid(void)
{
}

Grid::~Grid(void)
{
}

bool Grid::checkhit(int x ,int y)
{
if (field[x][y]==true)
{
	std::cout&lt;&lt;&quot;Treffer!&quot;&lt;&lt;std::endl;
	this-&gt;removeship(x,y);
	return true;
}
else
{
	std::cout&lt;&lt;&quot;Kein Treffer!&quot;&lt;&lt;std::endl;
	return false;
}
}

void Grid::setrandomship()
{
	srand(time(NULL));
	int x = rand() % 9,y = rand() % 9;
	if (field[x][y]== true)
	{
	this-&gt;setrandomship();
	}
	field[x][y] = true;
}

void Grid::removeship(int x,int y)
{
	if (field[x][y]==false)
	{
	std::cout&lt;&lt;&quot;Kein Schiff auf diesem Feld vorhanden!&quot;&lt;&lt;std::endl;
	}
	else
	{
	field[x][y] = false;
	}
}
</code></pre>
<p>Grid.h</p>
<pre><code>class Grid
{
public:
	Grid(void);
	~Grid(void);
	bool checkhit(int x,int y);
	void setrandomship();
	void removeship(int x,int y);
private:
	bool field[10][10];
};
</code></pre>
<p>Jetzt habe ich mir die Frage gestellt ob ich nun einfach für ein Schiff eine struct anlegen soll oder vllt doch eher eine Base Klasse und dann Vererbung benutzte,denn es gibt ja Schiffe die belegen 4,3,2,1 Felder.Daher könnte man ja einfach eine Basis Klasse Schiff anlegen und dann Vererbung benutzten für eine Klasse Schlachtschiff.Ist mein Ansatz so richtig oder würdet ihr es anders lösen?<br />
Mfg Ryko.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/315701/frage-zu-oop</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 08:22:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/315701.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Apr 2013 17:22:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu OOP on Tue, 09 Apr 2013 17:23:32 GMT]]></title><description><![CDATA[<p>Guten Tag,<br />
Ich versuche mich gerade an einem Schiffe versenken in der Konsole(ohne KI).<br />
Ich habe mir dazu erstmal diese Klasse geschrieben:</p>
<pre><code>#include &quot;Grid.h&quot;

Grid::Grid(void)
{
}

Grid::~Grid(void)
{
}

bool Grid::checkhit(int x ,int y)
{
if (field[x][y]==true)
{
	std::cout&lt;&lt;&quot;Treffer!&quot;&lt;&lt;std::endl;
	this-&gt;removeship(x,y);
	return true;
}
else
{
	std::cout&lt;&lt;&quot;Kein Treffer!&quot;&lt;&lt;std::endl;
	return false;
}
}

void Grid::setrandomship()
{
	srand(time(NULL));
	int x = rand() % 9,y = rand() % 9;
	if (field[x][y]== true)
	{
	this-&gt;setrandomship();
	}
	field[x][y] = true;
}

void Grid::removeship(int x,int y)
{
	if (field[x][y]==false)
	{
	std::cout&lt;&lt;&quot;Kein Schiff auf diesem Feld vorhanden!&quot;&lt;&lt;std::endl;
	}
	else
	{
	field[x][y] = false;
	}
}
</code></pre>
<p>Grid.h</p>
<pre><code>class Grid
{
public:
	Grid(void);
	~Grid(void);
	bool checkhit(int x,int y);
	void setrandomship();
	void removeship(int x,int y);
private:
	bool field[10][10];
};
</code></pre>
<p>Jetzt habe ich mir die Frage gestellt ob ich nun einfach für ein Schiff eine struct anlegen soll oder vllt doch eher eine Base Klasse und dann Vererbung benutzte,denn es gibt ja Schiffe die belegen 4,3,2,1 Felder.Daher könnte man ja einfach eine Basis Klasse Schiff anlegen und dann Vererbung benutzten für eine Klasse Schlachtschiff.Ist mein Ansatz so richtig oder würdet ihr es anders lösen?<br />
Mfg Ryko.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314189</guid><dc:creator><![CDATA[Ryko]]></dc:creator><pubDate>Tue, 09 Apr 2013 17:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Tue, 09 Apr 2013 17:36:58 GMT]]></title><description><![CDATA[<p>Nein, das macht keinen Sinn. Die Anzahl der Felder kann einfach eine Variable sein. Die Felder an sich sollten in zweidimensionalen Vektoren ausgedrückt werden, dafür kannst du dir eine <code>struct Position</code> schreiben, die einen zweidimensionalen Vektor repräsentiert.</p>
<blockquote>
<pre><code>bool field[10][10];
</code></pre>
</blockquote>
<p>Macht keinen Sinn. Ich würde als Element-Typ eine Enumeration nehmen:</p>
<pre><code>enum ShipType
{ 
   Nothing,
   Player1,
   Player2
};
</code></pre>
<p>Du musst schließlich speichern, von welchem Spieler das Schiff kommt.</p>
<blockquote>
<pre><code>srand(time(NULL));
</code></pre>
</blockquote>
<p>Das gehört in die <code>main()</code> . Den PRNG zu seeden direkt bevor man ihn benutzt ist sinnlos.</p>
<p>Wieso deklarierst/definierst du den Konstruktor und Destruktor selbst? Wenn sie sowieso leer bleiben (was ich allerdings für den Ctor bezweifle), dann kannst du auch die Definition dem Compiler überlassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314202</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 09 Apr 2013 17:36:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Tue, 09 Apr 2013 17:42:03 GMT]]></title><description><![CDATA[<p>Okay danke erstmal für die Antwort.Dann werde ich das mal umsetzten.<br />
Bzgl dem Konstruktor/Destruktor der wurde von dem VS Klassen Assistenten gesetzt und ich bin ja noch nicht fertig mit der Klasse und habe dann eben zwischen gefragt.Deswegen sind da eben noch Kon und Destruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314206</guid><dc:creator><![CDATA[Ryko]]></dc:creator><pubDate>Tue, 09 Apr 2013 17:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Tue, 09 Apr 2013 17:45:39 GMT]]></title><description><![CDATA[<p>Ryko schrieb:</p>
<blockquote>
<pre><code>Grid::Grid(void)
{
}

Grid::~Grid(void)
{
}
</code></pre>
</blockquote>
<p>Kommt dir das nicht irgendwie ein bisschen komisch vor?</p>
<blockquote>
<p>Jetzt habe ich mir die Frage gestellt ob ich nun einfach für ein Schiff eine struct anlegen soll oder vllt doch eher eine Base Klasse und dann Vererbung benutzte,denn es gibt ja Schiffe die belegen 4,3,2,1 Felder.Daher könnte man ja einfach eine Basis Klasse Schiff anlegen und dann Vererbung benutzten für eine Klasse Schlachtschiff.Ist mein Ansatz so richtig oder würdet ihr es anders lösen?<br />
Mfg Ryko.</p>
</blockquote>
<p>Deine Beschreibung offenbart übrigens die unter Anfängern sehr verbreitete Einstellung, alles mit Vererbung machen zu müssen, weil es sie gibt. Vererbung braucht man in C++ eher selten. Wieso sollten Schlachtschiff und Flugzeugträger von Schiff abgeleitet sein. Sicher, von der Bedeutung her ist ein Schlachtschiff ein Schiff und ein Flugzeugträger ist ein Schiff und du hast daher die &quot;ist ein&quot;-Beziehung, für die public-Vererbung steht. Aber für dein Spiel? Da sind &quot;Schlachtschiff&quot; und &quot;Flugzeugträger&quot; doch bloß willkürliche Namen für Objekte, die sich ansonsten exakt gleich verhalten. Das heißt, verpass der Klasse &quot;Schiff&quot; (sofern du sie überhaupt brauchst, siehe oben) ein Attribut für den Namen und du bist fertig. Diese Attribut muss nicht unbedingt ein string sein, ebenso könnte auch z.B. ein enum-Typ (0=Speedboot, 1=Uboot, usw.) geeignet sein.</p>
<p>Weiterhin: Welche Attribute braucht dein Schiff überhaupt? Du hast ja schon die Gitterpunkte:</p>
<pre><code>bool field[10][10];
</code></pre>
<p>Hier würde ich ganz dringend einen anderen Datentyp als bool nehmen. In Schiffe versenken gibt es schließlich viel mehr Zustände als 2. Ein Feld kann leer sein, es kann ein Schiff drauf sein (welches?), es kann beschossen worden sein (daneben) und es kann beschossen worden sein (Treffer. welches Schiff?).<br />
Dann ist dein Schiff nur noch ein Objekt auf das verwiesen wird, das mitzählt, ob das Schiff schon versenkt wurde oder nicht. Vielleicht weiß das Objekt auch noch, wie es dargestellt wird (das könnte mit dem Namen (Schlachtschiff/Flugzeugträger) zusammenhängen, so dass diese Information ein und die selbe ist.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314209</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 09 Apr 2013 17:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Tue, 09 Apr 2013 18:00:09 GMT]]></title><description><![CDATA[<p>Guten Tag Seppj,<br />
Ersteinmal danke für den Aufschlussreichen Beitrag.Ich komm von ner anderen Sprache und dort wird immer von Vererbung gepredigt(wie auch immer).Auch richtig erkannt hast du dass ich Anfänger in C++ bin.</p>
<blockquote>
<p>Welche Attribute braucht dein Schiff überhaupt?</p>
</blockquote>
<p>Gut das wären Größe,Name,Koordinaten,vielleicht auch welche Teile schon zerstört wurden/noch aktiv sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314225</guid><dc:creator><![CDATA[Ryko]]></dc:creator><pubDate>Tue, 09 Apr 2013 18:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Tue, 09 Apr 2013 18:08:45 GMT]]></title><description><![CDATA[<p>Ryko schrieb:</p>
<blockquote>
<p>Ich komm von ner anderen Sprache und dort wird immer von Vererbung gepredigt(wie auch immer).</p>
</blockquote>
<p>Java, oder? Ja, in Java denkt man anders als in C++. Da muss man das Umdenken lernen, wenn man wechselt. Ist oft schwer, weil das, was in Java gut und üblich ist, geht auch irgendwie in C++ hinzufrickeln, aber es ist im Ergebnis nicht das, was in C++ gut und üblich 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>
<blockquote>
<blockquote>
<p>Welche Attribute braucht dein Schiff überhaupt?</p>
</blockquote>
<p>Gut das wären Größe,Name,Koordinaten,vielleicht auch welche Teile schon zerstört wurden/noch aktiv sind.</p>
</blockquote>
<p>Klingt gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314231</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 09 Apr 2013 18:08:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Wed, 10 Apr 2013 06:21:40 GMT]]></title><description><![CDATA[<p>Die Koordinaten im Schiff mit zu speichern hat zwar Vorteile aber auch einen großen Nachteil. Du musst bei jedem Schuss im Grid überprüfen, ob dort ein Schiff liegt und du musst in Deinen Schiffen überprüfen, ob eines der Schiffe auf der beschossenen Koordinate liegt, das kann schnell zu Inkonsistenz führen.</p>
<p>Eine andere Möglichkeit ist, einen</p>
<pre><code>std::vector&lt;Ship&gt;
</code></pre>
<p>anzulegen und ein Schiff aus dem Array löschen, sobald es zerstört ist und überhaupt kein Grid verwenden. Bei einem Schuss gehst du deinen Vektor durch und überprüfst, ob ein Schiff getroffen wurde.</p>
<p>Eine andere Möglichkeit wäre, im Grid einen Verweiß auf dein Schiff anzulegen und darüber zu überprüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314314</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Wed, 10 Apr 2013 06:21:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Wed, 10 Apr 2013 12:24:03 GMT]]></title><description><![CDATA[<p>Die Frage ist, ob es Player vs CPU gibt, denn die KI wird dann wahrscheinlich ein Grid (oder eine <code>map</code> o.ä.) benötigen, um die bereits befeuerten Stellen zu speichern.</p>
<p>Die Klasse <code>Ship</code> kann ja eine Methode <code>isOn</code> anbieten, die prüft, ob es auf einer Koordinate ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314380</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 10 Apr 2013 12:24:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Wed, 10 Apr 2013 12:30:13 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Die Frage ist, ob es Player vs CPU gibt, denn die KI wird dann wahrscheinlich ein Grid (oder eine <code>map</code> o.ä.) benötigen, um die bereits befeuerten Stellen zu speichern.</p>
</blockquote>
<p>Außerdem kommt es auch gut, wenn der Spieler selbst sehen kann, ob ein Feld schon beschossen wurde. Auf das Grid würde ich nicht verzichten. Wenn überhaupt, dann eventuelle auf die Schiffsklasse.</p>
<blockquote>
<p>Die Klasse <code>Ship</code> kann ja eine Methode <code>isOn</code> anbieten, die prüft, ob es auf einer Koordinate ist.</p>
</blockquote>
<p>Das ist doch sehr umständlich. Ein besetztes Feld soll einen Verweis auf das Schiff haben, das auf dem Feld sitzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314381</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Apr 2013 12:30:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Wed, 10 Apr 2013 12:39:25 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<blockquote>
<p>Die Klasse <code>Ship</code> kann ja eine Methode <code>isOn</code> anbieten, die prüft, ob es auf einer Koordinate ist.</p>
</blockquote>
<p>Das ist doch sehr umständlich. Ein besetztes Feld soll einen Verweis auf das Schiff haben, das auf dem Feld sitzt.</p>
</blockquote>
<p>Nein, nein! Das war für den Fall, dass es <strong>kein Grid</strong> gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314383</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 10 Apr 2013 12:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Thu, 25 Apr 2013 22:01:26 GMT]]></title><description><![CDATA[<p>Guten Tag,<br />
Entschuldigung das ich mich erst so spät wieder melde,habe zur Zeit en bisschen was um die Ohren.</p>
<p>Ich hab mich jetzt gegen die Ship Klasse entschieden,da diese imo nicht nötig ist.<br />
Für den Vektor der das Spielfeld darstellen soll,habe ich nun ein enum erstellt.</p>
<pre><code>enum cell
{
	nothing,
	ship,
	destroyed
};
</code></pre>
<p>Um mir das mit den Koordinaten zu vereinfachen hab ich ne structure erstellt, die die x und y Koordinate beinhaltet.Diese habe ich ausserhalb der Klasse in der Header Datei definiert.<br />
In der Klasse habe ich momentan eine Funktion mit folgender Defintion:</p>
<pre><code>void SetHorizontalShip(int size,coordinates startPos,coordinates endPos);
</code></pre>
<p>Im cpp File meldet die IntelliSense von Vs nun folgenden Fehler:</p>
<blockquote>
<p>1 IntelliSense: Die Deklaration ist nicht mit &quot;&quot;void Grid::SetHorizontalShip(int size, &lt;error-type&gt; startPos, &lt;error-type&gt; endPos)&quot; (deklariert in Zeile 10 von &quot;*\Grid.h&quot;)&quot; kompatibel.</p>
</blockquote>
<p>Ich versteh nicht wieso die structure nicht als Typ erkannt wird.Könnt ihr mir sagen wo mein Fehler liegt?<br />
Schönen Tag noch und genießt das schöne Wetter solange es noch da 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="🙂"
    /><br />
Mfg Ryko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318524</guid><dc:creator><![CDATA[Ryko]]></dc:creator><pubDate>Thu, 25 Apr 2013 22:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Fri, 26 Apr 2013 18:52:16 GMT]]></title><description><![CDATA[<p>Hast du &quot;coordinates.h&quot; in &quot;Grid.h&quot; eingebunden? Wenn du auf die Schiffsklasse verzichtest, dann hast du das Problem, dass der Spieler ohne Weiteres nicht wissen kann, ob er das Schiff nur teilweise zerstört oder schon versenkt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318829</guid><dc:creator><![CDATA[Rew.]]></dc:creator><pubDate>Fri, 26 Apr 2013 18:52:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Fri, 26 Apr 2013 19:10:50 GMT]]></title><description><![CDATA[<p>Richtig vllt wäre die Schiffklasse dann ja doch sinvoll.Ich muss da nochmal genauer drüberdenken. Die Coordinates structure habe ich einfach nur in der Grid.h Deklariert,da sie nur 2 Member hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318835</guid><dc:creator><![CDATA[Ryko]]></dc:creator><pubDate>Fri, 26 Apr 2013 19:10:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu OOP on Fri, 26 Apr 2013 19:14:24 GMT]]></title><description><![CDATA[<p>Weiß die Funktion denn auch von ccordinates?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318837</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 26 Apr 2013 19:14:24 GMT</pubDate></item></channel></rss>