<?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[zyklische Abhängigkeiten und forward declarations]]></title><description><![CDATA[<p>Hi, ich habe folgende zyklische Abhängigkeit in meinem Design:</p>
<ul>
<li><code>scene.hpp</code> enthält die Deklaration einer Klasse <code>Scene</code> , die eine Spielszene beschreibt.</li>
<li><code>gameobject.hpp</code> enthält die Deklaration einer Klasse <code>GameObject</code> , die ein einzelnes Objekt der Spielszene beschreibt.</li>
<li>Eine <code>Scene</code> besitzt mehrere Instanzen von <code>GameObject</code> =&gt; <code>scene.hpp</code> benötigt das Symbol <code>GameObject</code> .</li>
<li>Ein <code>GameObject</code> kennt die <code>Scene</code> zu der es gehört =&gt; <code>gameobject.hpp</code> benötigt das Symbol <code>Scene</code></li>
</ul>
<p>.. also eine klassische zyklische Abhängigkeit. Ich wüsste nicht wie ich diese Abhängigkeit sinnvoll brechen kann. Ist es sinnvoll und legitim hier <strong>forward declarations</strong> zu verwenden und erst in der Implementierung die entsprechenden Header einzubinden? D.h.</p>
<pre><code>// scene.hpp

class GameObject;

// Rest der ursprünglichen Deklaration
</code></pre>
<pre><code>// scene.cpp

#include &quot;scene.hpp&quot;
#include &quot;gameobject.hpp&quot;

// Rest der ursprünglichen Implementierung
</code></pre>
<pre><code>// gameobject.hpp

class Scene;

// Rest der ursprünglichen Deklaration
</code></pre>
<pre><code>// gameobejct.cpp

#include &quot;gameobject.hpp&quot;
#include &quot;scene.hpp&quot;

// Rest der üblichen Implementierung
</code></pre>
<p>Denkbare wäre auch, die forward declaration nur in einem der Header (d.h. z.B. <code>class Scene;</code> in <code>gameobject.hpp</code> zu machen und im anderen Header schon mit <code>include</code> zu arbeiten (d.h. <code>#include &quot;gameobject.hpp</code> in <code>scene.hpp</code> ).</p>
<p>Rein technisch funktioniert das .. nur ist die Frage ob das hier noch best practise oder eher schon &quot;Bekämpfung der Symptome&quot; ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>LG Glocke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329819/zyklische-abhängigkeiten-und-forward-declarations</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 20:55:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329819.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Dec 2014 11:33:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to zyklische Abhängigkeiten und forward declarations on Tue, 09 Dec 2014 11:33:09 GMT]]></title><description><![CDATA[<p>Hi, ich habe folgende zyklische Abhängigkeit in meinem Design:</p>
<ul>
<li><code>scene.hpp</code> enthält die Deklaration einer Klasse <code>Scene</code> , die eine Spielszene beschreibt.</li>
<li><code>gameobject.hpp</code> enthält die Deklaration einer Klasse <code>GameObject</code> , die ein einzelnes Objekt der Spielszene beschreibt.</li>
<li>Eine <code>Scene</code> besitzt mehrere Instanzen von <code>GameObject</code> =&gt; <code>scene.hpp</code> benötigt das Symbol <code>GameObject</code> .</li>
<li>Ein <code>GameObject</code> kennt die <code>Scene</code> zu der es gehört =&gt; <code>gameobject.hpp</code> benötigt das Symbol <code>Scene</code></li>
</ul>
<p>.. also eine klassische zyklische Abhängigkeit. Ich wüsste nicht wie ich diese Abhängigkeit sinnvoll brechen kann. Ist es sinnvoll und legitim hier <strong>forward declarations</strong> zu verwenden und erst in der Implementierung die entsprechenden Header einzubinden? D.h.</p>
<pre><code>// scene.hpp

class GameObject;

// Rest der ursprünglichen Deklaration
</code></pre>
<pre><code>// scene.cpp

#include &quot;scene.hpp&quot;
#include &quot;gameobject.hpp&quot;

// Rest der ursprünglichen Implementierung
</code></pre>
<pre><code>// gameobject.hpp

class Scene;

// Rest der ursprünglichen Deklaration
</code></pre>
<pre><code>// gameobejct.cpp

#include &quot;gameobject.hpp&quot;
#include &quot;scene.hpp&quot;

// Rest der üblichen Implementierung
</code></pre>
<p>Denkbare wäre auch, die forward declaration nur in einem der Header (d.h. z.B. <code>class Scene;</code> in <code>gameobject.hpp</code> zu machen und im anderen Header schon mit <code>include</code> zu arbeiten (d.h. <code>#include &quot;gameobject.hpp</code> in <code>scene.hpp</code> ).</p>
<p>Rein technisch funktioniert das .. nur ist die Frage ob das hier noch best practise oder eher schon &quot;Bekämpfung der Symptome&quot; ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>LG Glocke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2431952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2431952</guid><dc:creator><![CDATA[Glocke]]></dc:creator><pubDate>Tue, 09 Dec 2014 11:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to zyklische Abhängigkeiten und forward declarations on Tue, 09 Dec 2014 12:39:18 GMT]]></title><description><![CDATA[<p>Meiner Meinung nach macht es immer Sinn mit Forward Declarations zu arbeiten und den Header nur dann einzubinden, wenn die komplette Klassendefinition auch tatsächlich benötigt wird. Das hilft nicht nur solche zyklischen Abhängigkeiten zu brechen, sondern reduziert auch generell die Abhängigkeiten der Header untereinander. Wenn so ein Projekt mal größer wird führt ansonsten jede kleine Änderung in einer Header-Datei dazu, dass große Teile des Projekts neu kompiliert müssen (weil die in den cpp-Dateien eingebundenen Header dann oft &quot;über etliche Ecken&quot; von dem Header abhängig sind, an dem du gerade Änderungen vorgenommen hast)</p>
<p>Generell: Wenn du nur einen (Smart-)Pointer auf die Klasse verwendest, dann empfiehlt sich eine solche Forward Declaration. Wenn du von der Klasse ableitest, oder diese z.B. ein nicht-Pointer-Member im aktuellen Header ist, kommst du allerdings nicht drum herum, auch den Header der Klasse einzubinden, weil dafür die komplette Definition bekannt sein muss.</p>
<p>Wenn in deinen Headern nur (Smart-)Pointer auf die andere Klasse auftreten (ohne diese zu kennen vermute ich das mal), würde ich also aus den o.g. Gründen in beiden mit einer Forward Declatation abreiten und die jeweiligen Header erst in der .cpp-Datei einbinden (dort, wo die komplette Klassendefinition auch wahrscheinlich tatsächlich erst benötigt wird).</p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2431958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2431958</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Tue, 09 Dec 2014 12:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to zyklische Abhängigkeiten und forward declarations on Tue, 09 Dec 2014 15:45:52 GMT]]></title><description><![CDATA[<p>Die &lt;GameObject.h&gt; kann auch am Anfang die Scene vorausdeklarieren und dann die &lt;Scene.h&gt; am Ende inkludieren. Dann haben sich die beiden Headers doch gegenseitig inkludiert, ohne zu weinen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2431980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2431980</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 09 Dec 2014 15:45:52 GMT</pubDate></item></channel></rss>