<?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[Mutual dependence mit Layering]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich Trottel habe eine Woche lang an einem Projekt gearbeitet, was ich ausschließlich in Notepad++ implementiert habe und habe dabei anscheinend einen wichtigen Faktor vergessen (testen konnte ich zwischendurch nicht). Und zwar habe ich gegenseitige Abhängigkeiten verbaut - juhu! (zum Teil auch mit Referenzen und so)</p>
<p>typische Situation:</p>
<pre><code class="language-cpp">class A
{
private:
    B _b;
};

// ...

class B
{
private:
    A _a;
};
</code></pre>
<p>Das man das Problem so nicht lösen kann habe ich bereits herausgefunden... Ist meine einzige Möglichkeit nun wirklich, das pImpl-Pattern anzuwenden mit forward declaration? Gibt es da nichts schöneres?<br />
Ich dachte immer, dass ich mit &quot;modernem&quot; C++ keine Pointer mehr benötige. Oder bezieht sich das eher darauf, dass ich kein <code>new</code> mehr benötige?</p>
<p>Wie würdet ihr das Problem umgehen? Gibt es schönere Lösungen?</p>
<p>Gracias!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306032/mutual-dependence-mit-layering</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 12:25:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306032.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Jul 2012 07:01:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mutual dependence mit Layering on Mon, 16 Jul 2012 07:04:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich Trottel habe eine Woche lang an einem Projekt gearbeitet, was ich ausschließlich in Notepad++ implementiert habe und habe dabei anscheinend einen wichtigen Faktor vergessen (testen konnte ich zwischendurch nicht). Und zwar habe ich gegenseitige Abhängigkeiten verbaut - juhu! (zum Teil auch mit Referenzen und so)</p>
<p>typische Situation:</p>
<pre><code class="language-cpp">class A
{
private:
    B _b;
};

// ...

class B
{
private:
    A _a;
};
</code></pre>
<p>Das man das Problem so nicht lösen kann habe ich bereits herausgefunden... Ist meine einzige Möglichkeit nun wirklich, das pImpl-Pattern anzuwenden mit forward declaration? Gibt es da nichts schöneres?<br />
Ich dachte immer, dass ich mit &quot;modernem&quot; C++ keine Pointer mehr benötige. Oder bezieht sich das eher darauf, dass ich kein <code>new</code> mehr benötige?</p>
<p>Wie würdet ihr das Problem umgehen? Gibt es schönere Lösungen?</p>
<p>Gracias!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233086</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 16 Jul 2012 07:04:38 GMT</pubDate></item><item><title><![CDATA[Reply to Mutual dependence mit Layering on Mon, 16 Jul 2012 07:57:20 GMT]]></title><description><![CDATA[<p>Ich würde etwas am Design ändern. Ehrlich gesagt hatte ich noch nie zwei Klassen die voneinander abhängig waren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233097</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Mon, 16 Jul 2012 07:57:20 GMT</pubDate></item><item><title><![CDATA[Reply to Mutual dependence mit Layering on Mon, 16 Jul 2012 08:07:12 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Ist meine einzige Möglichkeit nun wirklich, das pImpl-Pattern anzuwenden mit forward declaration? Gibt es da nichts schöneres?</p>
</blockquote>
<p>Abstrakte Basisklasse (in Java auch als Interface bekannt) wäre eine Möglichkeit.</p>
<blockquote>
<p>Ich dachte immer, dass ich mit &quot;modernem&quot; C++ keine Pointer mehr benötige. Oder bezieht sich das eher darauf, dass ich kein <code>new</code> mehr benötige?</p>
</blockquote>
<p>Typischer Irrtum. In modernem C++ arbeitet man nicht mehr mit <em>besitzenden rohen</em> Pointern. Die altbekannten C-Pointer können in C und altem C++ verschiedene Semantik haben. C-Pointer als optionale, umbiegbare Referenzen sind auch in modernem C++ noch erlaubt und üblich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233101</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 16 Jul 2012 08:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to Mutual dependence mit Layering on Mon, 16 Jul 2012 08:11:37 GMT]]></title><description><![CDATA[<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Ich würde etwas am Design ändern. Ehrlich gesagt hatte ich noch nie zwei Klassen die voneinander abhängig waren.</p>
</blockquote>
<p>das kann ich mir aber auch nicht vorstellen. damit schaffst du ja ein komplett lineares design</p>
<p>wie setzt du zum beispiel das observer oder visitor pattern um?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233102</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 16 Jul 2012 08:11:37 GMT</pubDate></item><item><title><![CDATA[Reply to Mutual dependence mit Layering on Mon, 16 Jul 2012 08:25:44 GMT]]></title><description><![CDATA[<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Ich würde etwas am Design ändern. Ehrlich gesagt hatte ich noch nie zwei Klassen die voneinander abhängig waren.</p>
</blockquote>
<p>Ist hier nicht zu vermeiden.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: Wie muss ich mir dann vorstellen das Problem zu lösen?<br />
Wenn ich in der / den Klassen als Memberattribute nur Pointer habe (seien es auch Smart-Pointer), so bleibt mir doch gar nichts anderes übrig, als dass ich das Objekt im Konstruktor auf dem Heap erstelle... oder übersehe ich etwas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233108</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 16 Jul 2012 08:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Mutual dependence mit Layering on Mon, 16 Jul 2012 08:57:01 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>wie setzt du zum beispiel das observer oder visitor pattern um?</p>
</blockquote>
<p>Ich hab mich vielleicht ein wenig falsch ausgedrückt. Was ich meinte ist, dass bei mir noch nie zwei Klassen jeweils ein Objekt der anderen Klasse als Member hatten. Das Visitor Pattern habe ich auch schon implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233121</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Mon, 16 Jul 2012 08:57:01 GMT</pubDate></item><item><title><![CDATA[Reply to Mutual dependence mit Layering on Mon, 16 Jul 2012 09:01:22 GMT]]></title><description><![CDATA[<p>ok, ein object auf die jeweils andere klasse, ist aus meiner sicht auch dringligst(dieses wort sieht falsch aus O_o) zu vermeiden, aber gegenseitige abhängigkeiten kommen öfters vor</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233123</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 16 Jul 2012 09:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Mutual dependence mit Layering on Mon, 16 Jul 2012 09:43:45 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>ok, ein object auf die jeweils andere klasse, ist aus meiner sicht auch dringligst(dieses wort sieht falsch aus O_o) zu vermeiden</p>
</blockquote>
<ol>
<li>dringlichst.</li>
<li>es ist nicht zu vermeiden, es geht schlichtweg nicht. Was soll der Compiler denken, der das sieht? &quot;Ok, ich hab ein A. Darin ein B. Darin ein A. Darin ein B. Darin ein - ach du mich auch mal...&quot;</li>
</ol>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20378">@theliquidwave</a>: normalerweise besitzt das A ein B, das B hat aber nur Zugriff auf das A, besitzt es aber nicht. Ganz simpel mit forward deklarations sieht das dann so aus:</p>
<pre><code class="language-cpp">class A;

class B {
  A papa;
};

class A {
  B myBKind;
};
</code></pre>
<p>Etwas mehr Entkopplung erhält man durch Interfaces/abstrakte Klassen:</p>
<pre><code class="language-cpp">class BNeedsThis //or something like this
{
public:
  virtual void bar() = 0;
};

class B
{
  BNeedsThis&amp; iNeedThis;
public:
  B(BNeedsThis &amp; whatINeed) : iNeedThis(whatINeed)
  {}

  void foo() {iNeedThis.bar();}
};

class A : public BNeedsThis
{
  B myB;
public:
  A() : myB(*this) {}

  virtual void bar() {std::cout &lt;&lt; &quot;:-)\n&quot;;}
};
</code></pre>
<p>BNeedsThis gehört in die gleiche Ebene wie B, damit hat B keinerlei Abhängikeit mehr von der Höheren Ebene von A.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233132</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 16 Jul 2012 09:43:45 GMT</pubDate></item></channel></rss>