<?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[Wo gehören die Objekte hin?]]></title><description><![CDATA[<p>Hallo. Eine Designfrage.</p>
<p>Scott Meyers sagt. Gebe keine Referenzen auf die internen Daten eines Objektes aus. Das schwächt die Kapselung. Schön und gut. Versteh ich auch.</p>
<p>Nun zur Praxis und zu meinem Konkreten Problem.</p>
<p>Ich habe eine Klasse virtual_machine_t. Diese beötigt zugriff auf ein Objekt der des typs return_stack_t um funktionieren zu können. Naheliegend also erst einmal den Stapel als privaten member anzugeben. Jetzt soll aber auf diesen Stapel, genauer die gleiche <strong>Instanz</strong>, von anderen Objekten aus von außen aus zugegriffen werden. Jetzt stellt sich mir die Frage ob ich eine Referenz auf den Stapel zurückgeben soll, oder eine Referenz auf den Stapel als Übergabeparameter für die Konstruktion von virtual_machine_t verlange. Die Konstruktion des Stapels sozusagen in die Hände des Benutzers der Klasse lege.<br />
Welchen Weg würdet ihr gehen und warum. Beide Wege scheinen mir plausibel zu sein.</p>
<p>Danke,<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297953/wo-gehören-die-objekte-hin</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 04:58:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297953.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Jan 2012 14:28:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wo gehören die Objekte hin? on Tue, 10 Jan 2012 14:28:06 GMT]]></title><description><![CDATA[<p>Hallo. Eine Designfrage.</p>
<p>Scott Meyers sagt. Gebe keine Referenzen auf die internen Daten eines Objektes aus. Das schwächt die Kapselung. Schön und gut. Versteh ich auch.</p>
<p>Nun zur Praxis und zu meinem Konkreten Problem.</p>
<p>Ich habe eine Klasse virtual_machine_t. Diese beötigt zugriff auf ein Objekt der des typs return_stack_t um funktionieren zu können. Naheliegend also erst einmal den Stapel als privaten member anzugeben. Jetzt soll aber auf diesen Stapel, genauer die gleiche <strong>Instanz</strong>, von anderen Objekten aus von außen aus zugegriffen werden. Jetzt stellt sich mir die Frage ob ich eine Referenz auf den Stapel zurückgeben soll, oder eine Referenz auf den Stapel als Übergabeparameter für die Konstruktion von virtual_machine_t verlange. Die Konstruktion des Stapels sozusagen in die Hände des Benutzers der Klasse lege.<br />
Welchen Weg würdet ihr gehen und warum. Beide Wege scheinen mir plausibel zu sein.</p>
<p>Danke,<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2166344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2166344</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Tue, 10 Jan 2012 14:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wo gehören die Objekte hin? on Tue, 10 Jan 2012 14:34:39 GMT]]></title><description><![CDATA[<p>das ist doch schon nicht ganz koscher. wenn 2 klassen auf einen member zugreifen müssen sind sie ja schon nicht unabhängig.<br />
was hast du denn vor, kannst du deinen fall auf ein minimales beispiel runterbrechen?</p>
<p>ansonsten kapselung beibehalten und kopien per methode hin- und herreichen<br />
also per getter und setter und gleichzeitig sorgen diese methoden für konsistenz innerhalb der datenstruktur</p>
<p>edit: oder zur not zeiger. also z.b. einen shared_ptr&lt;DEINE_LISTE&gt; als member von beiden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2166348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2166348</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 10 Jan 2012 14:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wo gehören die Objekte hin? on Tue, 10 Jan 2012 15:57:04 GMT]]></title><description><![CDATA[<p>Meinst du bei Stapel einen Container/Collection? Bei diesen Objekttypen sagt Meyers aber auch, das es eine Ausnahme gibt: man darf und kann nur direkt darauf zugreifen. vector, list u.a. machen es vor.</p>
<p>Ansonst, wenn sich der Stapel in einem Objekt befindet, wirst du natürlich kapseln müssen.</p>
<pre><code class="language-cpp">class A
{
   stapel m_stapel;
};
</code></pre>
<p>Darf man nicht auf m_stapel direkt zugreifen! Aber du kannst auf s einen getter und setter schreiben.</p>
<pre><code class="language-cpp">class A
{
   stapel m_stapel;
public:
   stapel get_stapel() const
   {
        return m_stapel;
   }
   void set_stapel(const stapel &amp;s)
   {
        m_stapel = s;
   }
};
</code></pre>
<p>Jeder schlaue Compiler wird z.B. beim Aufruf des getters schauen, ob er sich das Kopieren sparen kann, selbst wenn es keine Reference ist, die zurück kommt.</p>
<p>Wenn was kopiert wird, haste Pech.</p>
<p>Aber, du kannst das ganze minimieren:</p>
<pre><code class="language-cpp">class A
{
   stapel&lt;B&gt; m_stapel;
public:
   B pop() const
   {
       return m_stapel.pop();
   }

   void push(B &amp;b)
   {
       m_stapel.push(b);
   }

   stapel&lt;B&gt; get_stapel() const
   {
        return m_stapel;
   }
   void set_stapel(const stapel&lt;B&gt; &amp;s)
   {
        m_stapel = s;
   }
};
</code></pre>
<p>Bei der Kapselung muß man einfach den <em>langfristigen</em> Vorteil sehen: die Wartung des Codes wird einfacher. Und man muß etwas Performance verzichten und hoffen, das der Compiler was optimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2166397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2166397</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 10 Jan 2012 15:57:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wo gehören die Objekte hin? on Tue, 10 Jan 2012 17:42:25 GMT]]></title><description><![CDATA[<p>OK. Danke schön. Hab das Problem gelöst. virtual_machine_t ist im Besitz der Objekte. Diese sind privat und werden über Methoden der virtual_machine_t Schnitstelle manipuliert. Keine Referenzen werden somit nach außen gegeben. Dein letztes Codebeispiel hat mich in die richtige Richtung gelenkt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Das nächste Problem wartet allerdings schon. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2166456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2166456</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Tue, 10 Jan 2012 17:42:25 GMT</pubDate></item></channel></rss>