<?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[Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgende Klassenhierarchie:</p>
<p>Basisklasse A, davon abgeleitet B, C, D ...</p>
<p>Ich habe eine Fabrikklasse die Objekte der Klassen B, C, D erzeugen und &quot;als A zurückgeben&quot; soll + ein bool, das anzeigt, ob die Produktion erfolgreich war. Momentan benutze ich (vereinfacht) folgendes Schema:</p>
<pre><code class="language-cpp">class Factory {

   bool tryProduce(A *&amp;zurueck) {
      zurueck = new B();
      return true;
   }

}
</code></pre>
<p>Benutzt wird sie so:</p>
<pre><code class="language-cpp">int main(void) {
   Factory f();
   A* bla = 0;
   while(...) {
      bool b = f.tryProduce(bla);
      if (b) { std::cout &lt;&lt; bla-&gt;toString(); } else { ... }
   }

}
</code></pre>
<p>Gibt es eine bessere Möglichkeit als mit Referenzen auf Pointer zu arbeiten? Damit kommt ja leider dynamische Speicherallokation ins Spiel.</p>
<p>Ich komme von JAVA und dort lässt sich das alles viel einfacher lösen dank JAVA-Referenzen <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/topic/294656/rückgabe-von-quot-objekten-quot-der-basisklasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 19:44:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294656.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Oct 2011 14:42:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 14:42:26 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgende Klassenhierarchie:</p>
<p>Basisklasse A, davon abgeleitet B, C, D ...</p>
<p>Ich habe eine Fabrikklasse die Objekte der Klassen B, C, D erzeugen und &quot;als A zurückgeben&quot; soll + ein bool, das anzeigt, ob die Produktion erfolgreich war. Momentan benutze ich (vereinfacht) folgendes Schema:</p>
<pre><code class="language-cpp">class Factory {

   bool tryProduce(A *&amp;zurueck) {
      zurueck = new B();
      return true;
   }

}
</code></pre>
<p>Benutzt wird sie so:</p>
<pre><code class="language-cpp">int main(void) {
   Factory f();
   A* bla = 0;
   while(...) {
      bool b = f.tryProduce(bla);
      if (b) { std::cout &lt;&lt; bla-&gt;toString(); } else { ... }
   }

}
</code></pre>
<p>Gibt es eine bessere Möglichkeit als mit Referenzen auf Pointer zu arbeiten? Damit kommt ja leider dynamische Speicherallokation ins Spiel.</p>
<p>Ich komme von JAVA und dort lässt sich das alles viel einfacher lösen dank JAVA-Referenzen <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/2137444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137444</guid><dc:creator><![CDATA[totalerbeginner]]></dc:creator><pubDate>Sat, 29 Oct 2011 14:42:26 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 14:55:41 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct Factory
{
   A* tryProduce()
   { 
      return new B();
   }
}

int main()
{
   Factory f; //mit Klammern ist das eine Funktionsdeklaration
   while(...)
   {
      A* obj = f.tryProduce();
      if (obj) { std::cout &lt;&lt; obj-&gt;toString(); } else { ... }
   }
}
</code></pre>
<p>Wenn das Erzeugen fehlschlägt, gibst du 0/nullptr zurück oder wirfst eine Exception.</p>
<blockquote>
<p>Ich komme von JAVA und dort lässt sich das alles viel einfacher lösen dank JAVA-Referenzen <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>
</blockquote>
<p>Java-Referenzen sind nichts anderes als Zeiger.</p>
<p>Mit rohen Zeigern zu arbeiten empfiehlt sich in C++ meist nicht, stattdessen solltest du intelligente Zeiger einsetzen (im wesentlichen unique_ptr und shared_ptr).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137451</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 29 Oct 2011 14:55:41 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 15:26:55 GMT]]></title><description><![CDATA[<p>Okay, nur muss ich mir eben in JAVA erstmal keine großen Gedanken um den Speicher machen.<br />
Über shared_ptr hab ich schon nachgedacht. Ich dachte halt, es gibt eine andere Standardmethode mein Problem zu lösen, ohne Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137473</guid><dc:creator><![CDATA[totalerbeginner]]></dc:creator><pubDate>Sat, 29 Oct 2011 15:26:55 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 15:32:32 GMT]]></title><description><![CDATA[<p>Du willst keinen shared_ptr sondern unique_ptr. Ich weiß gar nicht, warum hier dauernd irgendwelche Leute shared_ptr empfehlen. Haltet doch einfach mal die Fresse, wenn ihr keine Ahnung habt. Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137478</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 29 Oct 2011 15:32:32 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 16:42:03 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Haltet doch einfach mal die Fresse, wenn ihr keine Ahnung habt.</p>
</blockquote>
<p>Besoffen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137526</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 29 Oct 2011 16:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 16:47:28 GMT]]></title><description><![CDATA[<p>nope, du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137533</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 29 Oct 2011 16:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 16:50:39 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>nope, du?</p>
</blockquote>
<p>Noch nicht...<br />
Aber danke für die Klarstellung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137535</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 29 Oct 2011 16:50:39 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 17:37:18 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Du willst keinen shared_ptr sondern unique_ptr. Ich weiß gar nicht, warum hier dauernd irgendwelche Leute shared_ptr empfehlen. Haltet doch einfach mal die Fresse, wenn ihr keine Ahnung habt. Danke.</p>
</blockquote>
<p>Fakt ist, solange du nicht weißt was mit den Objekten gemacht wird, kannst du nicht vorwerfen das falsche Smartpointer empfohlen werden.</p>
<p>Grundsätzlich ist shared_ptr ein &quot;teurer&quot; Smartpointer, dennoch kann er je nach Aufgabenstellung der einzig richtige sein (Auch wenn der Standard wohl eher etwas wie der unique_ptr sein sollte).</p>
<p>Ich sehe übrigens in keinen Post eine Empfehlung zwangsweise den shared_ptr zu verwenden, es wurde unique_ptr und shared_ptr zusammen erwähnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137562</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sat, 29 Oct 2011 17:37:18 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 17:40:31 GMT]]></title><description><![CDATA[<p>totalerbeginner:<br />
ne, gibt keine Standardmethode. Du brauchst Referenzen/Zeiger in jedem Fall, da Du bei Rückgabe per value einigen Kopieraufwand hättest (der wegoptimiert werden könnte, worauf ich mich aber nicht so gerne verlasse) und v.a. bewirkt, dass die Infos von B,C,D bei der Verkürzung auf A gelöscht werden (Slicing).</p>
<p>Schließe einfach einen besagten Smartpointer um das Objekt herum. Das ist meiner Ansicht nach eine gute Methode Factory-Rückgabewerte umzusetzen. Bzw. ich mache das bei mir so, dass ich mir zwar pure Zeiger zurückliefern lasse, diese aber in einem unique_ptr verstaue.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137566</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 29 Oct 2011 17:40:31 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sat, 29 Oct 2011 18:39:45 GMT]]></title><description><![CDATA[<p>Danke.</p>
<p>Ich muss mal schauen, welchen smarten Pointer ich am Schluss benötige.<br />
Btw. kann da nix schiefgehen, wenn du den &quot;pure&quot; Zeiger erst nachträglich verstaust? Wenn in der Zwischenzeit (mittels pure Pointer) schon ein anderer Pointer auf das Objekt erzeugt worden wäre oder so? Nur aus Interesse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137591</guid><dc:creator><![CDATA[totalerbeginner]]></dc:creator><pubDate>Sat, 29 Oct 2011 18:39:45 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe von &amp;quot;Objekten&amp;quot; der Basisklasse on Sun, 30 Oct 2011 01:09:23 GMT]]></title><description><![CDATA[<p>Wenn man pure Zeiger zurückgibt, muss der Aufrufer natürlich die Disziplin besitzen, jeweils sofort einen <code>unique_ptr</code> einzusetzen. Allerdings sehe ich den Sinn nicht ganz, wenn das der ganze Einsatzzweck sein soll, zumal <code>unique_ptr</code> movable ist und somit von Funktionen zurückgegeben werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2137719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2137719</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 30 Oct 2011 01:09:23 GMT</pubDate></item></channel></rss>