<?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[Vererbung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich brauche zum ersten mal Vererbung in C++ und stoße auf Hindernisse in Form von einem Compiler-Fehler.</p>
<p>Der Fehler:</p>
<blockquote>
<p>expected class-name before '{' token</p>
</blockquote>
<p>Wall.h (soll von Block.h erben)</p>
<pre><code class="language-cpp">#ifndef WALL_H_
#define WALL_H_

#include &quot;Block.h&quot; // &lt;-- class Block reinholen
#include &quot;Engine.h&quot; // &lt;-- unwichtig

class Engine;

class Wall : public Block { // &lt;-- hier Fehler

protected:
	Engine* engine;

public:
	SDL_Rect box;

	Wall(Engine* enginee, int x, int y, int w, int h);
	void show();
};

#endif
</code></pre>
<p>Block.h</p>
<pre><code class="language-cpp">#ifndef BLOCK_H_
#define BLOCK_H_

#include &quot;Engine.h&quot;

class Engine;

class Block {

protected:
	Engine* engine;

public:
	SDL_Rect box;

	Block(Engine* enginee, int x, int y, int w, int h);
	void show();
};

#endif
</code></pre>
<p>bisher sehen Wall und Block ziemlich identisch aus, das ist aber einfach weil ich bisher nur Wall hatte und jetzt versuche Block neu zu erstellen um Vererbung einzuführen, weil ich noch mehr Elemente wie Wall brauche, die von Block erben sollen.<br />
Wie dem auch sei, warum sagt der mir so einen Fehler an? Kennt er &quot;Block&quot; nicht als class? Er hat doch den include? <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289385/vererbung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 05:44:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289385.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 03 Jul 2011 21:50:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 21:50:37 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich brauche zum ersten mal Vererbung in C++ und stoße auf Hindernisse in Form von einem Compiler-Fehler.</p>
<p>Der Fehler:</p>
<blockquote>
<p>expected class-name before '{' token</p>
</blockquote>
<p>Wall.h (soll von Block.h erben)</p>
<pre><code class="language-cpp">#ifndef WALL_H_
#define WALL_H_

#include &quot;Block.h&quot; // &lt;-- class Block reinholen
#include &quot;Engine.h&quot; // &lt;-- unwichtig

class Engine;

class Wall : public Block { // &lt;-- hier Fehler

protected:
	Engine* engine;

public:
	SDL_Rect box;

	Wall(Engine* enginee, int x, int y, int w, int h);
	void show();
};

#endif
</code></pre>
<p>Block.h</p>
<pre><code class="language-cpp">#ifndef BLOCK_H_
#define BLOCK_H_

#include &quot;Engine.h&quot;

class Engine;

class Block {

protected:
	Engine* engine;

public:
	SDL_Rect box;

	Block(Engine* enginee, int x, int y, int w, int h);
	void show();
};

#endif
</code></pre>
<p>bisher sehen Wall und Block ziemlich identisch aus, das ist aber einfach weil ich bisher nur Wall hatte und jetzt versuche Block neu zu erstellen um Vererbung einzuführen, weil ich noch mehr Elemente wie Wall brauche, die von Block erben sollen.<br />
Wie dem auch sei, warum sagt der mir so einen Fehler an? Kennt er &quot;Block&quot; nicht als class? Er hat doch den include? <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088411</guid><dc:creator><![CDATA[Djinndrache]]></dc:creator><pubDate>Sun, 03 Jul 2011 21:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 21:58:30 GMT]]></title><description><![CDATA[<p>Das, was man hier sieht sieht eigentlich gut aus (syntaktisch auf jeden Fall; viel Sinn macht die Vererbung so nicht nicht, aber ich denke, dass dir das bewusst ist ;)).</p>
<p>Kannst du das Beispiel auf ein sonst unabhängig kompilierbares reduzieren?</p>
<p>Ich würde sagen, dass genau &quot;Engine.h&quot; das Problem macht. Dort hast du wahrscheinlich &quot;Wall.h&quot; und/oder &quot;Block.h&quot; inkludiert.</p>
<p>Falls ja (oder auch sonst) lies mal das <a href="http://www.drakon.ch/?id=&amp;offset=5&amp;mobile=0&amp;show_entry=77" rel="nofollow">hier</a> durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088413</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 03 Jul 2011 21:58:30 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 21:59:24 GMT]]></title><description><![CDATA[<p>Lass mich raten: Engine.h inkludiert Wall.h -&gt; BAM! zirkulärer Include.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088414</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 03 Jul 2011 21:59:24 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 22:07:33 GMT]]></title><description><![CDATA[<p>Den Fehler kann ich aus diesem Code auch nicht erkennen, womöglich ist doch in der &quot;Engine.h&quot; etwas kaputt.</p>
<p>Allerdings solltest du die Vererbung etwas gründlicher erledigen anstatt nur den Code zu duplizieren:<br />
- Wall benötigt keine eigene Engine und Box, da es diese Elemente von Block übernimmt<br />
- die show()-Methode soll vermutlich virtuell werden<br />
- und öffentliche Member wie box sind zumindest eine ungeschickte Lösung (unabhängig von Vererbung)</p>
<p>PS: Und die Forward-Deklaration von Engine ist auch unnötig, wenn du sowieso vorher die komplette Definition der Klasse eingebunden hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088416</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 03 Jul 2011 22:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 22:11:08 GMT]]></title><description><![CDATA[<p>Ja, die Engine.h includiert Wall, aber bisher hat es ja auch funktioniert.</p>
<p>Und &quot;class Wall;&quot; ist schon oben in der Engine.h deklariert, um so eine zirkulation zu vermeiden, was bisher auch eigentlich funktioniert hat (hatte früher schonmal probleme mit zirkulation, daher die deklaration). Erst seit ich den Vererbungsversuch mache, geht das nicht mehr.</p>
<p>Habe der Engine.h auch mal &quot;class Block;&quot; hinzugefügt, das behebt aber gar nichts. Weiterhin der identische Fehler <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="😞"
    /></p>
<p>Wenn ich &quot;class Block;&quot; in Wall.h deklariere, kommen übrigens zwei andere Fehler statt dem bisherigen:</p>
<blockquote>
<p>forward declaration of 'struct Block'</p>
<p>invalid use of incomplete type 'struct Block'</p>
</blockquote>
<p>Um die Fehlerpositionen zu zeigen nochmal kurz die Wall.h:</p>
<pre><code class="language-cpp">#ifndef WALL_H_
#define WALL_H_

#include &quot;Block.h&quot;
#include &quot;Engine.h&quot;

class Block; // &lt;-- hier erste Fehlermeldung
class Engine;

class Wall : public Block { // &lt;-- hier zweite Fehlermeldung

protected:
	Engine* engine;

public:
	SDL_Rect box;

	Wall(Engine* enginee, int x, int y, int w, int h);
	void show();
};

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2088419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088419</guid><dc:creator><![CDATA[Djinndrache]]></dc:creator><pubDate>Sun, 03 Jul 2011 22:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 22:18:32 GMT]]></title><description><![CDATA[<p>Dein Problem besteht darin, daß sich diese Header erstens (direkt oder indirekt) gegenseitig einbinden und zweitens per Include-Guards gegen Mehrfach-Definitionen geschützt sind. Dadurch stehen die Definitionen im fertigen Programm vermutlich nicht in der Reihenfolge, die du benötigst.<br />
Die Lösung ist (vermutlich) recht einfach: Wall und Block benötigen keine Definition der Engine, um definiert zu werden, also reicht dort die Forward-Deklaration (ohne den Include). Ob die Engine-Klasse von der Definition von Block oder Wall abhängig ist, kann ich nicht beurteilen - vermutlich ist sie es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088421</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 03 Jul 2011 22:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 22:18:47 GMT]]></title><description><![CDATA[<p>Djinndrache schrieb:</p>
<blockquote>
<p>Ja, die Engine.h includiert Wall, aber bisher hat es ja auch funktioniert.</p>
</blockquote>
<p>Dann hattest du bisher Glück.</p>
<p>Djinndrache schrieb:</p>
<blockquote>
<p>Und &quot;class Wall;&quot; ist schon oben in der Engine.h deklariert, um so eine zirkulation zu vermeiden [...]</p>
</blockquote>
<p>Der einzige Weg um ein zirkuläres Include zu vermeiden ist kein zirkuläres Include zu machen. Eine Forward-Declaration allein hilft da absolut gar nix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088422</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 03 Jul 2011 22:18:47 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 22:30:26 GMT]]></title><description><![CDATA[<p>Dann versuch ich wohl mal includes auszumisten, wenn sie nicht unbedingt benötigt werden.</p>
<p>Wenn ich die include Engine.h rausschmeiße, gibts aber schon Fehler:</p>
<blockquote>
<p>forward declaration of 'struct Engine'</p>
</blockquote>
<p>in der Zeile &quot;class Engine;&quot; von Block.h</p>
<p>und zweimal der Fehler</p>
<blockquote>
<p>invalid use of incomplete type 'struct Engine'</p>
</blockquote>
<p>in der Block.cpp auf folgenden Zeilen:</p>
<pre><code>void Block::show() {
	SDL_FillRect(engine-&gt;screen, &amp;box,
			SDL_MapRGB(engine-&gt;screen-&gt;format, 0x00, 0x00, 0x00));
}
</code></pre>
<p>Macht ja auch Sinn der Fehler, er weiß nicht was engine-&gt;screen ist oder ob es das überhaupt gibt. Also brauch ich den include der Engine.h in Block.h oder nicht?</p>
<p>(Ich hab im moment viele public variablen, das werde ich später noch geschickter durch getter und setter Methoden bauen, vorerst ist das aber ok so)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088424</guid><dc:creator><![CDATA[Djinndrache]]></dc:creator><pubDate>Sun, 03 Jul 2011 22:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 22:35:25 GMT]]></title><description><![CDATA[<p>Das erste klingt nicht nach einer Fehlermeldung - jedenfalls nicht nach einer vollständigen.</p>
<p>Djinndrache schrieb:</p>
<blockquote>
<p>Macht ja auch Sinn der Fehler, er weiß nicht was engine-&gt;screen ist oder ob es das überhaupt gibt. Also brauch ich den include der Engine.h in Block.h oder nicht?</p>
</blockquote>
<p>In der Block.h benötigst du den Include nicht (dort reicht die Forward-Deklaration), in der Block.cpp schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088426</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 03 Jul 2011 22:35:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 22:44:41 GMT]]></title><description><![CDATA[<p>Du brauchst weder in Block.h noch in Wall.h Engine.h inkludieren. Dort reicht eine forward-declaration, so wie du sie schon in Zeile 6 bzw 7 hast.</p>
<p>Allerdings musst du Engine.h in Block.cpp und Wall.cpp inkludieren.</p>
<p>Ich weiss nicht wie es dein compiler handhabt (VS2010 hat keine Probleme damit), aber es empfiehlt sich struct und class nicht zu mischen. Sprich du solltest sowohl bei der Deklaration als auch bei der Definition entweder struct oder eben class verwenden (nicht mal so mal so).<br />
Wie gesagt, ich weiss nicht inwiefern andere compiler damit Probleme haben und ob es grundsätzlich Probleme geben könnte, aber ich würd rein aus Konsistenzgründen schon dazu tendieren, nicht zu mixen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088428</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Sun, 03 Jul 2011 22:44:41 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 22:45:10 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Das erste klingt nicht nach einer Fehlermeldung - jedenfalls nicht nach einer vollständigen.</p>
<p>Djinndrache schrieb:</p>
<blockquote>
<p>Macht ja auch Sinn der Fehler, er weiß nicht was engine-&gt;screen ist oder ob es das überhaupt gibt. Also brauch ich den include der Engine.h in Block.h oder nicht?</p>
</blockquote>
<p>In der Block.h benötigst du den Include nicht (dort reicht die Forward-Deklaration), in der Block.cpp schon.</p>
</blockquote>
<p>Ah, natürlich! Hab es jetzt funktionsfähig bekommen <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>Die Fehlermeldung war so vollständig, zumindest laut eclipse.</p>
<p>Ich werde jedenfalls erstmal kräftig den Code aufräumen bevor ich was neues mache, da es mittlerweile doch schon leicht unübersichtlich wird an einigen Stellen.</p>
<p>Danke euch allen für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088429</guid><dc:creator><![CDATA[Djinndrache]]></dc:creator><pubDate>Sun, 03 Jul 2011 22:45:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Sun, 03 Jul 2011 23:00:10 GMT]]></title><description><![CDATA[<p>Wenn du meinen Link gelesen hättest wärst du selbst drauf gekommen. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2088433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088433</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 03 Jul 2011 23:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung on Mon, 04 Jul 2011 07:44:09 GMT]]></title><description><![CDATA[<p>Djinndrache schrieb:</p>
<blockquote>
<p>Ich werde jedenfalls erstmal kräftig den Code aufräumen bevor ich was neues mache, da es mittlerweile doch schon leicht unübersichtlich wird an einigen Stellen.</p>
</blockquote>
<p>Das ist eine gute Idee, und das sollte man immer wieder machen, nicht nur alle Jubeljahre mal, wenn man auf die Nase gefallen ist <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="😉"
    /><br />
Zu den #includes etc. auch folgendes: <a href="http://www.gotw.ca/gotw/007.htm" rel="nofollow">http://www.gotw.ca/gotw/007.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088510</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 04 Jul 2011 07:44:09 GMT</pubDate></item></channel></rss>