<?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[Objektreferenzierung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Objektmodell mit vier Objekten (A, B, C, D). A-&gt;B und B-&gt;C sowie B-&gt;D.</p>
<p>Nun soll B-&gt;A oder auch D-&gt;B auch möglich sein. B enthält dazu eine Methode, die einen Shared Pointer auf A zurückgibt.</p>
<p>Wie realisiere ich das Modell am Besten? Boost und C++11 stehen zur Verfügung.</p>
<p>Es dürfen natürlich keine Zyklen auftreten, sonst wird der Speicher bei Shared Pointern nicht freigegeben. <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/306781/objektreferenzierung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 08:33:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306781.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Aug 2012 13:03:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 13:03:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Objektmodell mit vier Objekten (A, B, C, D). A-&gt;B und B-&gt;C sowie B-&gt;D.</p>
<p>Nun soll B-&gt;A oder auch D-&gt;B auch möglich sein. B enthält dazu eine Methode, die einen Shared Pointer auf A zurückgibt.</p>
<p>Wie realisiere ich das Modell am Besten? Boost und C++11 stehen zur Verfügung.</p>
<p>Es dürfen natürlich keine Zyklen auftreten, sonst wird der Speicher bei Shared Pointern nicht freigegeben. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2239629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239629</guid><dc:creator><![CDATA[Matze1247]]></dc:creator><pubDate>Tue, 07 Aug 2012 13:03:00 GMT</pubDate></item><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 13:15:39 GMT]]></title><description><![CDATA[<p>Was bedeutet A-&gt;B? Vererbung? Komposition?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239637</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 07 Aug 2012 13:15:39 GMT</pubDate></item><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 13:30:43 GMT]]></title><description><![CDATA[<p>haha, geht sowas eig?<br />
A erbt von B, B erbt von A?<br />
noch nie ausprobiert xD</p>
<p>@TE: wenn es komposition ist, dann speicher dir in den besitzenden objekten einen shared_ptr und in den davon abhängigen objekten jeweils einen weak_ptr...</p>
<p>edit: ok, zirkuläre vererbung geht nicht, weil beim vererben der ganze typ bekannt sein muss. ohne tricks geht das also nicht <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/2239646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239646</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 07 Aug 2012 13:30:43 GMT</pubDate></item><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 14:14:14 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>haha, geht sowas eig?<br />
A erbt von B, B erbt von A?</p>
</blockquote>
<p>Wie soll das gehen? Eine der Klassendefinitionen ist zum Zeitpunkt zu dem geerbt werden soll zwangsläufig noch nicht vorhanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239674</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 07 Aug 2012 14:14:14 GMT</pubDate></item><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 14:28:32 GMT]]></title><description><![CDATA[<p>Nein, es ist keine Vererbung, sondern eine Komposition!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239682</guid><dc:creator><![CDATA[Matze1247]]></dc:creator><pubDate>Tue, 07 Aug 2012 14:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 14:47:10 GMT]]></title><description><![CDATA[<p>Matze1247 schrieb:</p>
<blockquote>
<p>Nein, es ist keine Vererbung, sondern eine Komposition!</p>
</blockquote>
<p>Geht genauso wenig. In einem A ist ein B. In einem B ist ein A. Also ist in einem A ein B, darin ein A, darin ein B, darin ein A,....</p>
<p>Matze1247 schrieb:</p>
<blockquote>
<p>Es dürfen natürlich keine Zyklen auftreten, sonst wird der Speicher bei Shared Pointern nicht freigegeben.</p>
</blockquote>
<p>Dafür gibts weak_ptr. Aber was haben shared_ptr mit Komposition zu tun?</p>
<p>Was willst du erreichen? (klar ausgedrückt, nicht mit A, B, C)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239696</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 07 Aug 2012 14:47:10 GMT</pubDate></item><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 16:09:19 GMT]]></title><description><![CDATA[<p>Kann man eigentlich noch ungenauere Fragen stellen?<br />
Sind A,B,C,D Namen von Objekten? Sind es Klassen?<br />
Was heißt &quot;A-&gt;B&quot;? Aus den Kontext scheint das hier etwas mit &quot;Verlinkung&quot; per Zeiger oder ähnliches zu tun zu haben.</p>
<p>So oder so reicht das nicht, um dem Fragesteller helfen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239724</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 07 Aug 2012 16:09:19 GMT</pubDate></item><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 20:24:42 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Kann man eigentlich noch ungenauere Fragen stellen?</p>
</blockquote>
<p>Was soll daran unpräzise sein? Die Frage ist recht klar und Skym0sh0 hat sie beantwortet.</p>
<p>Aufbruch der zyklischen Referenz mit weak_ptr. Funktioniert wunderbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239825</guid><dc:creator><![CDATA[Matze1247]]></dc:creator><pubDate>Tue, 07 Aug 2012 20:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Objektreferenzierung on Tue, 07 Aug 2012 20:44:15 GMT]]></title><description><![CDATA[<p>Hier übrigens ein kleines Codebeispiel:</p>
<pre><code class="language-cpp">#ifndef _INTERFACE_H_
#define _INTERFACE_H_

#include &lt;iostream&gt;
#include &lt;memory&gt;

struct IA;
struct IB;

struct IA
{
    virtual void SetIB(std::shared_ptr&lt;IB&gt; in_iB) = 0;
    virtual std::shared_ptr&lt;IB&gt; GetIB() = 0;
    virtual void Display() = 0;
};

struct IB
{
    virtual void SetIA(std::shared_ptr&lt;IA&gt; in_iA) = 0;
    virtual std::shared_ptr&lt;IA&gt; GetIA() = 0;
    virtual void Display() = 0;
};

#endif

#ifndef _IMPL_H_
#define _IMPL_H_

#include &quot;Interface.h&quot;

struct A : public IA
{
    A() { std::cout &lt;&lt; &quot;Constructor in A&quot; &lt;&lt; std::endl; }
    ~A() {  std::cout &lt;&lt; &quot;Destructor in A&quot; &lt;&lt; std::endl;  }
    void SetIB(std::shared_ptr&lt;IB&gt; in_iB) { m_iB = in_iB; }
    virtual std::shared_ptr&lt;IB&gt; GetIB() { return m_iB; }
    virtual void Display() { std::cout &lt;&lt; &quot;Hello from A&quot; &lt;&lt; std::endl; }

    std::shared_ptr&lt;IB&gt; m_iB;
};

struct B : public IB
{
    B() { std::cout &lt;&lt; &quot;Constructor in B&quot; &lt;&lt; std::endl; }
    ~B() {  std::cout &lt;&lt; &quot;Destructor in B&quot; &lt;&lt; std::endl;  }
    void SetIA(std::shared_ptr&lt;IA&gt; in_iA) { m_iA = in_iA; }
    virtual std::shared_ptr&lt;IA&gt; GetIA() { return m_iA; }
    virtual void Display() { std::cout &lt;&lt; &quot;Hello from B&quot; &lt;&lt; std::endl; }

    std::shared_ptr&lt;IA&gt; m_iA;
};

#endif

#include &lt;iostream&gt;
#include &quot;Impl.h&quot;

int main()
{
    std::shared_ptr&lt;A&gt; a(new A());
    std::shared_ptr&lt;B&gt; b(new B());

    a-&gt;SetIB(b);
    //b-&gt;SetIA(a);    // Zyklus!

    a-&gt;Display();
    b-&gt;Display();

    return 0;
}
</code></pre>
<p>Setzt man b-&gt;SetIA(a); wird logischerweise kein Destruktor mehr aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2239836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2239836</guid><dc:creator><![CDATA[Matze1247]]></dc:creator><pubDate>Tue, 07 Aug 2012 20:44:15 GMT</pubDate></item></channel></rss>