<?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 von Klassen über mehrere Header ( Problem )]]></title><description><![CDATA[<p>Ich habe folgendes vor:</p>
<p>[ Main.cpp ]</p>
<pre><code>#include &quot;Engine.h&quot;

CEngine g_Engine;
</code></pre>
<p>[ Engine.h ]</p>
<pre><code>#include &quot;Direct3D.h&quot;

class CEngine
{

};
</code></pre>
<p>[ Direct3D.h ]</p>
<pre><code>#include &quot;Engine.h&quot;

class CDirect3D : public CEngine
{

};
</code></pre>
<p>Leider bekomme ich so einen Fehler:</p>
<blockquote>
<p>&gt; error C2504: 'CEngine' : base class undefined &lt;&lt;</p>
</blockquote>
<p>Ich denke ich habe dort etwas falsch verstanden und<br />
inkludiere falsch oder nutze die Vererbung der Klassen<br />
falsch. Allerdings würde ich es schon gerne so haben, das<br />
ich über die Main auf die Engine Klasse zugreife und<br />
die Engine Klasse einen Zugriff auf die Direct3D Klasse<br />
hat und die im gegenzug eine Vererbung auf die Engine<br />
Klasse hat.</p>
<p>Mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334358/vererbung-von-klassen-über-mehrere-header-problem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 17:51:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334358.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Sep 2015 18:48:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Tue, 08 Sep 2015 18:48:37 GMT]]></title><description><![CDATA[<p>Ich habe folgendes vor:</p>
<p>[ Main.cpp ]</p>
<pre><code>#include &quot;Engine.h&quot;

CEngine g_Engine;
</code></pre>
<p>[ Engine.h ]</p>
<pre><code>#include &quot;Direct3D.h&quot;

class CEngine
{

};
</code></pre>
<p>[ Direct3D.h ]</p>
<pre><code>#include &quot;Engine.h&quot;

class CDirect3D : public CEngine
{

};
</code></pre>
<p>Leider bekomme ich so einen Fehler:</p>
<blockquote>
<p>&gt; error C2504: 'CEngine' : base class undefined &lt;&lt;</p>
</blockquote>
<p>Ich denke ich habe dort etwas falsch verstanden und<br />
inkludiere falsch oder nutze die Vererbung der Klassen<br />
falsch. Allerdings würde ich es schon gerne so haben, das<br />
ich über die Main auf die Engine Klasse zugreife und<br />
die Engine Klasse einen Zugriff auf die Direct3D Klasse<br />
hat und die im gegenzug eine Vererbung auf die Engine<br />
Klasse hat.</p>
<p>Mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467277</guid><dc:creator><![CDATA[Zigeuner736]]></dc:creator><pubDate>Tue, 08 Sep 2015 18:48:37 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Tue, 08 Sep 2015 19:54:21 GMT]]></title><description><![CDATA[<p>Warum brauchst du in der <code>Engine.h</code> ein <code>#include &quot;Direct3D.h&quot;</code> ? Deine Header includen sich gegenseitig und das ist wohl die Ursache für den Problem und die merkwürdige Fehlermeldung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467290</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 08 Sep 2015 19:54:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Wed, 09 Sep 2015 06:27:17 GMT]]></title><description><![CDATA[<p>Ich möchte logisch agieren und in der Engine z.B. die Fenster-Verwaltung durchführen und diese Engine greift dann auf die Direct3D zu z.B. um das Fenster neu zu Initialisieren zu können. Allerdings soll Direct3D auf Engine Variablen zurückgreifen können, z.B. m_Width, m_Height.</p>
<p>Sowas muss doch möglich sein, ansonsten zerbricht mein ganzes Konzept. Denn später möchte ich meinen CPlayer von CMap erben lassen und CIntersect von CPlayer ect.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467325</guid><dc:creator><![CDATA[Zigeuner736]]></dc:creator><pubDate>Wed, 09 Sep 2015 06:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Wed, 09 Sep 2015 06:38:08 GMT]]></title><description><![CDATA[<p>Die Lösung dürften wohl eher virtuelle Funktionen sein. So ist dein Konzept jedenfalls zerbrochen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467327</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 09 Sep 2015 06:38:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Wed, 09 Sep 2015 06:42:06 GMT]]></title><description><![CDATA[<p>Zigeuner736 schrieb:</p>
<blockquote>
<p>Sowas muss doch möglich sein, ansonsten zerbricht mein ganzes Konzept. Denn später möchte ich meinen CPlayer von CMap erben lassen und CIntersect von CPlayer ect.</p>
</blockquote>
<p>Das Konzept würde ich wirklich überarbeiten. Vererbung stellt eine Ist-Beziehung da. Du erweiterst und spezialisierst damit eine andere Klasse. Ein Player ist aber keine Map und ein Intersect ist auch kein Player.</p>
<p>Hast du zufällig C++ von A bis Z gelesen? Da wird der Zusammenhang nämlich genau falsch erklärt: <a href="https://www.c-plusplus.net/forum/272350-full">https://www.c-plusplus.net/forum/272350-full</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467328</guid><dc:creator><![CDATA[Tobiking2]]></dc:creator><pubDate>Wed, 09 Sep 2015 06:42:06 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Wed, 09 Sep 2015 08:06:59 GMT]]></title><description><![CDATA[<p>Es wäre so schön zu behaupten, das dieses Buch Schuld für mein Versagen ist. Allerdings liegt es rein an mir, ich habe C++ nie richtig mit einem Buch gelernt, aber auch nicht über Tutorials oder so etwas. Ich habe es mir versucht selbst bei zu bringen und eine kleine Voxel Engine ( Spiel ) geschrieben, das Minecraft imitiert. Allerdings wollte ich das Projekt neu starten, um eine bessere Struktur zu erreichen und mehr nach Regeln zu arbeiten. Ich wollte dabei dieses Vererbung's Prinzip anwenden, allerdings habe ich da ziemlich was falsch verstanden. Es wäre wirklich schön gewesen, wenn z.B. Direct3D direkt auf die Member von Engine zugreifen könnte und Engien dann auf Funktionen von Direct3D. Gut, leider scheint dies nicht möglich zu sein. Ich sollte das ganze mal überdenken, dachte ich erspare mir diese ganzen Funktions-Parameter, besonders weil ich ein Code von 8000 Zeilen-Code habe in der Engine ..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467341</guid><dc:creator><![CDATA[Zigeuner736]]></dc:creator><pubDate>Wed, 09 Sep 2015 08:06:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Wed, 09 Sep 2015 09:56:33 GMT]]></title><description><![CDATA[<p>Zigeuner736 schrieb:</p>
<blockquote>
<p>Es wäre wirklich schön gewesen, wenn z.B. Direct3D direkt auf die Member von Engine zugreifen könnte und Engien dann auf Funktionen von Direct3D. Gut, leider scheint dies nicht möglich zu sein. Ich sollte das ganze mal überdenken, dachte ich erspare mir diese ganzen Funktions-Parameter, besonders weil ich ein Code von 8000 Zeilen-Code habe in der Engine ..</p>
</blockquote>
<p>Doch! Es ist möglich, aber so wie du das offenbar vorhast sieht es nicht nach einem guten Klassendesign aus.<br />
Man <em>kann</em> es schon so machen, aber mit sehr hoher Wahrscheinlichkeit wären dann deine Include-Probleme dann nur der Anfang eines langen Weges durchs Tal der Tränen <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 />
Die hier erwähnte &quot;ist ein&quot;-Frage ist auf jeden Fall eine gute Richtschnur, anhand der man erkennen kann, ob man vielleicht auf dem Holzweg ist:<br />
Ist die abgeleitete Klasse auch ein solches Ding wie das von dem sie erbt? Wenn nicht, handelt man sich wahrscheinlich Probleme ein (auch wenn es da Ausnahmen gibt).</p>
<p>Das &quot;überdenken&quot; würde ich dir also auch nahelegen. Allerdings kann es nicht schaden auch zu verstehen, was bei deinem Include überhaupt schiefgelaufen ist:</p>
<p>In solchen Fällen einfach mal Schritt für Schritt durchgehen, was da eigentlich inkludiert und kompiliert wird, Dann ist die Fehlermeldung auch leicht nachvollziehbar.<br />
<code>#include</code> -Anweisungen sind schließlich nicht viel mehr als ein Copy-Paste der Datei an die Stelle, an der das <code>#include</code> steht:</p>
<pre><code>// Main.cpp:
// #include &quot;Engine.h&quot;

// Engine.h
//#include &quot;Direct3D.h&quot;

// Direct3D.h
class CDirect3D : public CEngine
{
};

// Rest von Engine.h
class CEngine
{
};

// Rest von Main.cpp
CEngine g_Engine;
</code></pre>
<p>Beachte Zeile 8: CDirect3D erbt hier von <code>CEngine</code> , obwohl CEngine noch nicht <em>deklariert</em> oder <em>definiert</em> wurde, wobei letzteres notwendig ist,<br />
um von der Klasse erben zu können. Du müsstest also dafür sorgen, dass <code>CEngine</code> <em>vor</em> <code>CDirect3D</code> definiert wird. Also entweder:</p>
<p>- kein <code>#include &quot;Direct3D.h&quot;</code> in &quot;Engine.h&quot;, stattdessen <code>#include &quot;Engine.h&quot;</code> in &quot;Direct3D.h&quot;<br />
- oder: <code>#include &quot;Direct3D.h&quot;</code> erst <em>nach</em> der Definition von <code>CEngine</code> in &quot;Engine.h&quot; (nicht so schön)<br />
- oder (wahrscheinlich besser): Komposition statt Vererbung: Ist <code>CDirect3D</code> wirklich eine &quot;Engine&quot; oder nicht vielmehr ein API-Interface? Wie wäre z.B. sowas hier?</p>
<pre><code>class CGraphicsAPI
{
   public:
      virtual void open_window() = 0;
      virtual void draw_something() = 0;
      virtual void close_window() = 0;
};

class CDirect3D : GraphicsAPI
{
   public:
      void open_window() override {  ... ID3D11DeviceContext* ... }
      void draw_something() override { ... context-&gt;draw(...) ... }
      void close_window() override { ... context-&gt;Release() ... }
};

class COpenGL : GraphicsAPI
{
   public:
      void open_window() override { ... wglCreateContext(...) ... }
      void draw_something() override { ... glDrawBuffers(...) ... }
      void close_window() override { ... wglDeleteContext(...) ... }
};

class CEngine
{
   // &quot;Komposition&quot;:
   GraphicsAPI* graphicsAPI;
};
</code></pre>
<p>... nur so als Beispiel, wie man so etwas abstrahieren könnte.<br />
Damit löst sich dann auch dein Include-Problem auf.</p>
<p>Gruss,<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467355</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Wed, 09 Sep 2015 09:56:33 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Wed, 09 Sep 2015 09:59:13 GMT]]></title><description><![CDATA[<p>Zigeuner736 schrieb:</p>
<blockquote>
<p>Es wäre wirklich schön gewesen, wenn z.B. Direct3D direkt auf die Member von Engine zugreifen könnte und Engien dann auf Funktionen von Direct3D.</p>
</blockquote>
<p>Das kannst du schon machen (mit z.b. public membern), ist dann halt kacke.</p>
<p>Wenn du von ueberall auf alles zugreifst, wirst du sehr schnell den Ueberblick verlieren, wann wo welche Daten gelesen und geschrieben werden. Eine sinnvolle Klassenstruktur ist eines der Hilfsmittel um deine 8000 Zeilen sinnvoll zu ordnen. Du solltest also z.b. deine Engine noch etwas weiter aufteilen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467358</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Wed, 09 Sep 2015 09:59:13 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung von Klassen über mehrere Header ( Problem ) on Wed, 09 Sep 2015 13:19:56 GMT]]></title><description><![CDATA[<p>Vielen Dank für die vielen interessanten Nachrichten.<br />
Ich werde mich mal mit dem Thema mehr beschäftigen und<br />
mein Konzept ein bisschen umgestalten. Eine kleine Frage<br />
hätte ich noch. Wie sieht es denn aus, wenn ich in meiner<br />
Engine Class einen Pointer zu der Klasse Direct3D erstelle<br />
und im Constructor ein Parameter mit &quot;this&quot; für die Engine<br />
Klasse angebe, wäre so etwas machbar ? Und wie sieht es<br />
aus, ist das schlimm bezüglich public ect. ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2467398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2467398</guid><dc:creator><![CDATA[Zigeuner736]]></dc:creator><pubDate>Wed, 09 Sep 2015 13:19:56 GMT</pubDate></item></channel></rss>