<?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[Objekt als Rückgabewert, Speichern in Zeiger]]></title><description><![CDATA[<p>Hallo NG</p>
<p>Ich schlage mich mal wieder mit dem Problem der Rückgabewerte von Funktionen herum. Ich möchte folgende Funktion aufrufen und deren Ergebnis in einem Zeiger speichern:</p>
<pre><code>XmlContainer XmlManager::openContainer(...)
</code></pre>
<p>Ich habe dafür eine Varibale</p>
<pre><code>XmlContainer* datacont
</code></pre>
<p>als privaten Member in der Klasse deklariert und möchte diesem Member das Ergebnis der Funktion zuweisen.<br />
Bei</p>
<pre><code>datacont = &amp;(xmlMgr-&gt;openContainer(...));
</code></pre>
<p>meckert der Kompiler &quot;warning: taking address of temporary&quot;, und bei</p>
<pre><code>*datacont=xmlMgr-&gt;openContainer(...);
</code></pre>
<p>gibt es einen Speicherzugriffsfehler zur Ausführungszeit.</p>
<p>Also dass Problem mal allgemein ausgedrückt. Wie weise ich einem Zeiger ein Objekt zu, dessen Konstruktor ich nicht selbst aufgerufen habe, sondern der in einer mir fremden Funktion aufgerufen wurde und mir nur das Ergebnis zur Verfügung gestellt wird?</p>
<p>Ich hoffe ich konnte mein Problem ausreichend darstellen.</p>
<p>LG<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205374/objekt-als-rückgabewert-speichern-in-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 02:26:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205374.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Feb 2008 15:56:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt als Rückgabewert, Speichern in Zeiger on Wed, 13 Feb 2008 15:56:38 GMT]]></title><description><![CDATA[<p>Hallo NG</p>
<p>Ich schlage mich mal wieder mit dem Problem der Rückgabewerte von Funktionen herum. Ich möchte folgende Funktion aufrufen und deren Ergebnis in einem Zeiger speichern:</p>
<pre><code>XmlContainer XmlManager::openContainer(...)
</code></pre>
<p>Ich habe dafür eine Varibale</p>
<pre><code>XmlContainer* datacont
</code></pre>
<p>als privaten Member in der Klasse deklariert und möchte diesem Member das Ergebnis der Funktion zuweisen.<br />
Bei</p>
<pre><code>datacont = &amp;(xmlMgr-&gt;openContainer(...));
</code></pre>
<p>meckert der Kompiler &quot;warning: taking address of temporary&quot;, und bei</p>
<pre><code>*datacont=xmlMgr-&gt;openContainer(...);
</code></pre>
<p>gibt es einen Speicherzugriffsfehler zur Ausführungszeit.</p>
<p>Also dass Problem mal allgemein ausgedrückt. Wie weise ich einem Zeiger ein Objekt zu, dessen Konstruktor ich nicht selbst aufgerufen habe, sondern der in einer mir fremden Funktion aufgerufen wurde und mir nur das Ergebnis zur Verfügung gestellt wird?</p>
<p>Ich hoffe ich konnte mein Problem ausreichend darstellen.</p>
<p>LG<br />
Timo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455193</guid><dc:creator><![CDATA[horscht2999]]></dc:creator><pubDate>Wed, 13 Feb 2008 15:56:38 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt als Rückgabewert, Speichern in Zeiger on Wed, 13 Feb 2008 16:01:42 GMT]]></title><description><![CDATA[<p>Drei Mögllichkeiten:</p>
<pre><code class="language-cpp">XmlContainer XmlManager::openContainer()
{
    XmlContainer xml;
    return xml;
}

XmlContainer* XmlManager::openContainer()
{
    XmlContainer *xml = new XmlContainer;
    return xml;
}

typedef std::tr1::shared_ptr&lt;XmlContainer&gt; XmlCont_ptr;

XmlCont_ptr XmlManager::openContainer()
{
    XmlCont_ptr xml(new XmlContainer);
    return xml;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1455195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455195</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Wed, 13 Feb 2008 16:01:42 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt als Rückgabewert, Speichern in Zeiger on Wed, 13 Feb 2008 16:06:18 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>EDIT: zu spät, aber gut, greife ich mal Artchis auf:</p>
<p>Artchi schrieb:</p>
<blockquote>
<p>Drei Mögllichkeiten:</p>
<pre><code class="language-cpp">XmlContainer XmlManager::openContainer()
{
    XmlContainer xml;
    return xml;
}
</code></pre>
</blockquote>
<p>Das hilft nicht wirklich weiter, denke ich.<br />
Mir fallen aber noch ein :</p>
<pre><code class="language-cpp">XmlContainer* XmlManager::openContainer()
{
    static XmlContainer xml;
    return &amp;xml;
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">class XmlManager {
   XmlContainer intCont; // alternativ als Zeiger, Referenz, ....
// ...
};

XmlContainer* XmlManager::openContainer()
{
    return &amp;intCont;
}
</code></pre>
<p>Das hier lass ich einfach mal stehen:</p>
<p>Eine Frage, die Du Dir beim Design immer stellen solltest:<br />
woher kommt denn der Speicher, auf den ein Zeiger (hier: datacont) letztlich zeigen soll ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455197</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 13 Feb 2008 16:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt als Rückgabewert, Speichern in Zeiger on Wed, 13 Feb 2008 16:05:19 GMT]]></title><description><![CDATA[<p>Das Problem ist genau das was dein Compiler dir mitteilt: dass du die Adresse einer temporaeren Variablen nimmst, sprich, die variable wird direkt nach der Zuweisung zerstoert und dein Zeiger zeigt ins Niravana. Die temporaere Variable wird immer zerstoert, da kannst du nichts gegen machen, also musst du dir selbst eine Variable anlegen und den Inhalt der temporaeren Variable da reinkopieren (per copy-Konstruktor)<br />
Es gibt zweierlei Moeglichkeiten:</p>
<ol>
<li>Du benutzt eine normale (automatische) Variable</li>
</ol>
<pre><code class="language-cpp">XmlContainer datacont = xmlMgr-&gt;openContainer(...);
</code></pre>
<ol start="2">
<li>Du benutzt wie geplant einen Zeiger (oder vielleicht besser einen Smartpointer) und laesst dir mit new ein entsprechende Objekt auf dem Heap erstellen</li>
</ol>
<pre><code class="language-cpp">XmlContainer* pdcont = new XmlContainer(xmlMgr-&gt;openContainer(...));
</code></pre>
<p>Dann darfst du allerdings nicht vergessen, spaeter delete aufzurufen (es sei denn du nutzt Smartpointer)</p>
<p>In vielen Faellen (zumindest in vielen Faellen, denen man als Anfaenger begegnet) ist die Variante mit dem Zeiger allerdings nicht notwendig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455201</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 13 Feb 2008 16:05:19 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt als Rückgabewert, Speichern in Zeiger on Wed, 13 Feb 2008 16:31:58 GMT]]></title><description><![CDATA[<p>Alles klar. Das mit dem Copy-Constructor hat funktioniert. Danke schön!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455212</guid><dc:creator><![CDATA[horscht2999]]></dc:creator><pubDate>Wed, 13 Feb 2008 16:31:58 GMT</pubDate></item></channel></rss>