<?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[Gegenseitiges Include - wie am besten zu lösen?]]></title><description><![CDATA[<p>Das Problem habe ich in meinem jetzigen Projekt leider jetzt schon häufiger. Klassisches Beispiel ist natürlich, wenn ich in einer Klasse ein Attribut oder eine Methode vom Rückgabetyp der anderen Klasse habe, aber die zweite Klasse gleichzeitig eine Methode hat, die einen Parameter der ersten Klasse nimmt, weil das Objekt einer solchen Klasse beispielsweise wieder einen Zeiger auf eines der ersten Klasse haben soll.</p>
<p>Wie löst man denn sowas gescheit? Eine Klassendefinition im Voraus in einer der beiden Datein anstatt des include hilft ja manchmal, aber auch nicht mehr, wenn man Attribute oder Methoden dieser Klasse benutzt. Und wenn überhaupt, in welchem Header sollte man dann überhaupt bevorzugt so eine Klassendefinition machen? Da habe ich nämlich noch keine Regel gefunden, wie das optimal läuft.</p>
<p>In meinem Fall reicht das aber sowieso nicht mehr aus. Was tut man da?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199419/gegenseitiges-include-wie-am-besten-zu-lösen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 16:51:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199419.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Dec 2007 20:55:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Sun, 02 Dec 2007 20:55:36 GMT]]></title><description><![CDATA[<p>Das Problem habe ich in meinem jetzigen Projekt leider jetzt schon häufiger. Klassisches Beispiel ist natürlich, wenn ich in einer Klasse ein Attribut oder eine Methode vom Rückgabetyp der anderen Klasse habe, aber die zweite Klasse gleichzeitig eine Methode hat, die einen Parameter der ersten Klasse nimmt, weil das Objekt einer solchen Klasse beispielsweise wieder einen Zeiger auf eines der ersten Klasse haben soll.</p>
<p>Wie löst man denn sowas gescheit? Eine Klassendefinition im Voraus in einer der beiden Datein anstatt des include hilft ja manchmal, aber auch nicht mehr, wenn man Attribute oder Methoden dieser Klasse benutzt. Und wenn überhaupt, in welchem Header sollte man dann überhaupt bevorzugt so eine Klassendefinition machen? Da habe ich nämlich noch keine Regel gefunden, wie das optimal läuft.</p>
<p>In meinem Fall reicht das aber sowieso nicht mehr aus. Was tut man da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413980</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Sun, 02 Dec 2007 20:55:36 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Sun, 02 Dec 2007 21:19:47 GMT]]></title><description><![CDATA[<p>Ohne klugscheissen zu wollen, ich würde das Klassendesign ändern. Hatte früher mit genau denselben Problemen zu tun und nach ein bisschen tüfteln hat sich eine viel einfachere Möglichkeit ergeben, ohne dass eine Klasse eine andere braucht und umgekehrt.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413984</guid><dc:creator><![CDATA[ceplusplus@loggedoff]]></dc:creator><pubDate>Sun, 02 Dec 2007 21:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Sun, 02 Dec 2007 21:30:40 GMT]]></title><description><![CDATA[<p>Wäre hier sicher auch möglich, werde ich vielleicht auch machen. Trotzdem schadet es ja nicht, für den Notfall ein paar Standard-Lösungen parat zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413987</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Sun, 02 Dec 2007 21:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Sun, 02 Dec 2007 21:56:44 GMT]]></title><description><![CDATA[<p>Ja schön ist sowas nicht aber irgendwann brauch man doch ne Krücke.</p>
<p>1.Methode<br />
Im Headerfile per Macro ausschließen das ein File nicht zweimal eingebunden wird.<br />
Das kann dann so aussehen.</p>
<pre><code>#ifndef  ___Headerfile_No1__h__
#define ___Headerfile_No1__h__
..  
..
..
#endif
</code></pre>
<p>Dann einfach im Headerfile das andere File einbinden.</p>
<p>2.Methode<br />
Wird nur der Pointer und nicht die Klasse als Objekt im Headerfile verwendet, dann kann man vor der Verwendung des Pointers diese Klasse quasi anmelden (Weiß nicht mehr wie das in dem Zusammenhang heißt)</p>
<p>Headerfile 1</p>
<pre><code>class CKlasseAusHeader1
{
   ...
};
</code></pre>
<p>Headerfile 2</p>
<pre><code>class CKlasseAusHeader1;  // geht in diesem Fall anstatt #include &lt;Headerfile 1&gt;
class CMachwas
{
    void MachWas(CKlasseAusHeader1* );
};
</code></pre>
<p>Der include von Headerfile 1 muß dann in allem .cpp-Files seperat geschehen welche Headerfile 2 einbinden und zwar nach dem einbinden von Headerfile 2.</p>
<p>Ich weiß nicht welche Compiler Methode 2 unterstützen ich kann mich auch nicht erinnern woher ich das weiß.</p>
<p>3.Methode<br />
Das Object als void pointer übergeben und dann später casten. (evtl noch ne Typenüberprüfung)</p>
<p>Alle Methoden sind nicht optimal, aber für den Hausgebrauch gehts.</p>
<p>Auf jeden Fall sollte man das nach Möglichkeit vermeiden da schließe ich mich meinem Vorredner an.</p>
<p>Babbage</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1413997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1413997</guid><dc:creator><![CDATA[Babbage]]></dc:creator><pubDate>Sun, 02 Dec 2007 21:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Sun, 02 Dec 2007 22:15:57 GMT]]></title><description><![CDATA[<p>Methode 1 benutze ich sowieso standardmäßig in jedem Header, ansonsten würde ich ja mit &quot;Redefinition&quot;-Fehlermeldungen überschwemmt.</p>
<p>Ich habe jetzt mein Programm so optimiert, dass Methode 2 ganz bequem passt. Ich hatte komplett die Option vergessen, aus der Source-Datei auf den anderen Header zu verweisen. Das löst das Problem natürlich recht schnell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414004</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Sun, 02 Dec 2007 22:15:57 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Sun, 02 Dec 2007 23:03:01 GMT]]></title><description><![CDATA[<p>Dazu brauchst du eigentlich nur eine forward-deklaration. Du schreibst zB sowas:</p>
<pre><code class="language-cpp">// header 1.h
class A;

class B // benutzt A
{
B(A* kA);
};

// datei 2.h
class A
{
// ...
};

//datei 1.cpp
#include &quot;1.h&quot;
#include &quot;2.h&quot;

B::B(A* a) { a-&gt;machwas(); }

// datei 2.cpp
#include &quot;1.h&quot;
#include &quot;2.h&quot;

A::A() { irgendwas; }
</code></pre>
<p>Das selbe geht auch mit Referenzen, da der compiler dann weiß zeiger und refernezen sind nur 4 byte groß. Wenn du allerdings kompette Objekte der einen Klasse einbetten willst und umgekehrt auch, dann kann das ganze eh nicht funktionieren, weil dann der ein konstruktor den anderen aufrufen würde und wieder zurück und so weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414013</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 02 Dec 2007 23:03:01 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 06:37:05 GMT]]></title><description><![CDATA[<p>Babbage schrieb:</p>
<blockquote>
<p>2.Methode<br />
Wird nur der Pointer und nicht die Klasse als Objekt im Headerfile verwendet, dann kann man vor der Verwendung des Pointers diese Klasse quasi anmelden (Weiß nicht mehr wie das in dem Zusammenhang heißt)</p>
</blockquote>
<p>Das ist btw die Standardlösung - nennt sich &quot;Forward Deklaration&quot;. Und wenn du tatsächlich irgendwo damit nicht weiterkommst, hast du ein schwerwiegendes Problem in deinem Klassendesign.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414035</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Dec 2007 06:37:05 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 08:13:49 GMT]]></title><description><![CDATA[<p>Ja thx , Forward Deklaration, kam nicht mehr auf den Namem weil ich's schon ne Weile nicht mehr eingesetzt habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414054</guid><dc:creator><![CDATA[Babbage]]></dc:creator><pubDate>Mon, 03 Dec 2007 08:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 08:21:16 GMT]]></title><description><![CDATA[<p>Und was setzt du sonst ein - doch nicht etwa void-Zeiger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414058</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Dec 2007 08:21:16 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 08:46:00 GMT]]></title><description><![CDATA[<p>Also wenn ich das mit den void-pointern lese, läuft es mir kalt den Rücken runter.<br />
Damit machst du dir nur Probleme.</p>
<p>Klar, wenn du selber die Methoden immer richtig aufrufst, klappt das. Wenn aber mal wer anders an deinem Programm weiterarbeiten muss, fliegt dem das eventuell um die Ohren. Außerdem ist Quellcode mit vielen void pointer 100 mal schwerer zu durchschauen wie mit festen Typen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414065</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Mon, 03 Dec 2007 08:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 09:40:26 GMT]]></title><description><![CDATA[<p>Es wurde hier nicht nach &quot;schönen&quot; Möglichkeiten gefragt. Mit so'ner Einschränkung hätte ich ganz klar gesagt: REDESIGN</p>
<p>Aber eingesetzt hab ich gecastete void Zeiger auch schon <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414103</guid><dc:creator><![CDATA[Babbage]]></dc:creator><pubDate>Mon, 03 Dec 2007 09:40:26 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 10:02:00 GMT]]></title><description><![CDATA[<p>Babbage schrieb:</p>
<blockquote>
<p>Es wurde hier nicht nach &quot;schönen&quot; Möglichkeiten gefragt. Mit so'ner Einschränkung hätte ich ganz klar gesagt: REDESIGN</p>
</blockquote>
<p>Wieso? Forward Deklarationen sind eine saubere - und schöne Lösung zur Beseitigung gegenseitiger Abhängigkeiten.</p>
<blockquote>
<p>Aber eingesetzt hab ich gecastete void Zeiger auch schon <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Ich auch - aber erst, wenn gar nichts anderes mehr ging.<br />
(die einzige Situation, wo ich void-Zeiger einsetzen würde, ist - eine externe Bibliothek, die ihre Parameter als void-Zeiger <strong>fordert</strong>)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414113</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 03 Dec 2007 10:02:00 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 10:06:35 GMT]]></title><description><![CDATA[<p>Das Problem mit den Ring-Includes ist leider/gottseidank ein Produkt der &quot;ich-include-einfach-mal-alles-was-mir-in-den-sinn-kommt&quot;-Seuche und damit hausgemacht und relativ leicht vermeidbar. Es gibt eine Handvoll Moeglichkeiten, diese Seuche und damit das Include-Problem einzugrenzen:</p>
<p>- includes nur dann nutzen, wenn man das Interface der eingebundenen Klassendefinitionen auch wirklich braucht (sonst forward-deklaration wie oben).<br />
- Klassenimplementation von Klassendefinition trennen. Dadurch koennen die meisten, wenn nicht sogar alle Includes aus dem header in die source datei verlagert werden.<br />
- sog. compilation firewalls einbauen (&quot;pimpl-idiom&quot;), das reduziert die Abhaengigkeiten weiter.</p>
<p>Ein gutes Beispiel wie man das erreichen kann, gibt einer der <a href="http://www.gotw.ca/gotw/007.htm" rel="nofollow">GoTW-Artikel</a> von Herb Sutter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414117</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Dec 2007 10:06:35 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 10:29:35 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>- Klassenimplementation von Klassendefinition trennen. Dadurch koennen die meisten, wenn nicht sogar alle Includes aus dem header in die source datei verlagert werden.</p>
</blockquote>
<p>Das wird bei Templates aber sehr schwierig, da diese im Header stehen. Genau da bekomme ich hin und wieder solche Probleme...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414127</guid><dc:creator><![CDATA[Tobias W]]></dc:creator><pubDate>Mon, 03 Dec 2007 10:29:35 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 14:20:49 GMT]]></title><description><![CDATA[<p>Auch bei Templates kann man Vorwärtsreferenzen einsetzen (siehe z.B. &lt;iosfwd&gt;), auch wenn die Syntax etwas kryptisch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414255</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 03 Dec 2007 14:20:49 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 14:34:37 GMT]]></title><description><![CDATA[<p>Es klingt mir hier fast schobn so, als wären includes von der cpp-Datei aus eine häufigere Sache. Ich habe aber gelernt, von der cpp-Datei nur den entsprechenden Header zu inkludieren und von da alles weitere zu machen. Wie ist denn das jetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414263</guid><dc:creator><![CDATA[David Schneider]]></dc:creator><pubDate>Mon, 03 Dec 2007 14:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 14:43:15 GMT]]></title><description><![CDATA[<p>Wie schon gesagt wurde, sollte man in den Header-Dateien so wenig wie möglich inkludieren (da diese ja von anderen Header-Dateien und/oder Source-Dateien wiederum inkludiert werden können - und das bedeutet größere Abhängigkeiten und längere Compilezeiten).</p>
<p>Und in die Source-Datei sollten dann eben jene Header-Dateien eingebunden werden, welche dann zwingend benötigt werden (also auch nicht einfach überall alle Standard-Header einbinden).</p>
<p>Etwas anderes ist es, wenn man mit vorcompilierten Header-Dateien arbeitet (aber dies ist dann häufig compiler- und projektspezifisch).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414271</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 03 Dec 2007 14:43:15 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 16:43:28 GMT]]></title><description><![CDATA[<p>David Schneider schrieb:</p>
<blockquote>
<p>Es klingt mir hier fast schobn so, als wären includes von der cpp-Datei aus eine häufigere Sache. Ich habe aber gelernt, von der cpp-Datei nur den entsprechenden Header zu inkludieren und von da alles weitere zu machen. Wie ist denn das jetzt?</p>
</blockquote>
<p>Wie auch Th sagt:<br />
In den Header sollten so wenige Includes stehen wie irgendwie möglich.</p>
<p>Wenn man sich daran hält, so wird der Linkaufwand teilweise stark reduziert (auch ohne Precompiled Header, die mir persönlich alleine schon wegen dem Einsatz unterschiedlicher Compilern ein Dorn im Auge sind) sofern man nicht die Schnittstelle in den Headerdateien ändert, sondern nur die Implementierung (cpp). Zudem reduziert man die hier erwähnte Gefahr zyklischer Abhängigkeiten (Was muss zuerst eingelinkt werden: Das Huhn oder das Ei? ;p).</p>
<p>Zu dem Thema gab es erst vor Kurzen eine ausgiebige Diskussion in einen anderen Thread... (&quot;Basisklasse undefiniert&quot; glaube ich)</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414347</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 03 Dec 2007 16:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to Gegenseitiges Include - wie am besten zu lösen? on Mon, 03 Dec 2007 17:24:31 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Wenn man sich daran hält, so wird der Linkaufwand teilweise stark reduziert (auch ohne Precompiled Header, die mir persönlich alleine schon wegen dem Einsatz unterschiedlicher Compilern ein Dorn im Auge sind) sofern man nicht die Schnittstelle in den Headerdateien ändert, sondern nur die Implementierung (cpp).</p>
</blockquote>
<p>das ist ein bißchen durcheinander, finde ich. Wieso ändert sich der Link-Aufwand? Wenn ich eine Implementierungs-datei ändere, wird diese neu übersetzt und dann wird frisch gelinkt... das kostet immer gleich. Damit haben auch precompiled header nichts zu tun.</p>
<p>Wo also spart man wirklich? -- Genau, bei der Compilezeit. Zum einen muß der Compiler weniger lesen, wenn weniger includes drin sind, also wird's schneller, zum anderen werden, selbst wenn man doch mal nen header ändert nur die Implementierungsdateien neu übersetzt, die auch wirklich von dessen Funktionalität abhängen.</p>
<p>Precompiled headers wirken eigentlich nur dem entgegen, dass der Compiler so viel lesen muß, dass Sachen, die eigentlich garnicht betroffen wären neu übersetzt werden verhindert afaik auch der nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1414361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1414361</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Mon, 03 Dec 2007 17:24:31 GMT</pubDate></item></channel></rss>