<?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[Unterschied zwischen Memberpointer und -objekt]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in der Literatur gesehen, dass Objekte entweder über einen Zeiger oder direkt in die Klasse eingebunden werden. Allerdings verstehe ich nicht ganz wodurch sich die beiden Varianten unterscheiden (Vorteile und Nachteile).<br />
Könntet ihr mir diesbezüglich weiterhelfen?</p>
<p>Pointer auf Objekt einbinden:</p>
<pre><code>[cpp]
class A {};

class B
{
 private:
  A* ptr;
};
[/cpp]
</code></pre>
<p>Objekt selbst einbinden:</p>
<pre><code>[cpp]
class A {};

class B
{
 private:
  A a;
};
[/cpp]
</code></pre>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264824/unterschied-zwischen-memberpointer-und-objekt</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 13:20:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264824.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Apr 2010 13:32:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 13:32:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in der Literatur gesehen, dass Objekte entweder über einen Zeiger oder direkt in die Klasse eingebunden werden. Allerdings verstehe ich nicht ganz wodurch sich die beiden Varianten unterscheiden (Vorteile und Nachteile).<br />
Könntet ihr mir diesbezüglich weiterhelfen?</p>
<p>Pointer auf Objekt einbinden:</p>
<pre><code>[cpp]
class A {};

class B
{
 private:
  A* ptr;
};
[/cpp]
</code></pre>
<p>Objekt selbst einbinden:</p>
<pre><code>[cpp]
class A {};

class B
{
 private:
  A a;
};
[/cpp]
</code></pre>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882157</guid><dc:creator><![CDATA[rickie]]></dc:creator><pubDate>Tue, 13 Apr 2010 13:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 13:34:39 GMT]]></title><description><![CDATA[<p>Das ist genau wie bei statischen u. dynamischen Variablen.<br />
Wenn du A a schreibst liegt der Mist aufm Stack. Schreibst du A* a = new a(); ist nur der A* - also Pointer - in Größe von 4 Byte aufm Stack der restliche Speicher kommt vom Heap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882158</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 13 Apr 2010 13:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 13:47:00 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Das ist genau wie bei statischen u. dynamischen Variablen.<br />
Wenn du A a schreibst liegt der Mist aufm Stack. Schreibst du A* a = new a(); ist nur der A* - also Pointer - in Größe von 4 Byte aufm Stack der restliche Speicher kommt vom Heap.</p>
</blockquote>
<p>Echt?</p>
<pre><code class="language-cpp">class A {};

class B
{
 private:
  A a;
};

B* b = new B;
</code></pre>
<p>Wo liegt a?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882165</guid><dc:creator><![CDATA[jokester]]></dc:creator><pubDate>Tue, 13 Apr 2010 13:47:00 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 13:52:29 GMT]]></title><description><![CDATA[<p>jokester schrieb:</p>
<blockquote>
<p>Wo liegt a?</p>
</blockquote>
<p>Auf'm heap. Aber das ist was ganz anderes.<br />
Kommt natürlich darauf an wo du das schreibst. Ich ging jetzt von innerhalb einer Funktion aus. Wenn es Bestandteil einer anderen Klasse ist und diese wird dynamisch erzeugt greift meine Aussage ja wieder.<br />
Und wenn ich sage, dass dann die Klasse auf'm heap liegt, dann schließt das logisch alle Member mit ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882167</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Tue, 13 Apr 2010 13:52:29 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 15:59:48 GMT]]></title><description><![CDATA[<p>Jetzt glaube ich es zu verstehen.</p>
<p>Sobald der Speicher mit dem Befehl new angefordert wird landet das Objekt auf dem Heap, ansonsten auf dem Stack.</p>
<pre><code>[cpp]
class A {};

class B
{
 private:
  A* ptr;
  B { ptr = new A; }
};
[/cpp]
</code></pre>
<p>Herzlichen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882254</guid><dc:creator><![CDATA[rickie]]></dc:creator><pubDate>Tue, 13 Apr 2010 15:59:48 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 16:01:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class A {};

class B
{
 private:
  A* ptr;
  B { ptr = new A; }
};
</code></pre>
<p>Korrektur:</p>
<pre><code class="language-cpp">class A {};

class B
{
 private:
  A* ptr;
  B { ptr = new A; }
  ~B { delete ptr; }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1882256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882256</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Tue, 13 Apr 2010 16:01:36 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 16:02:14 GMT]]></title><description><![CDATA[<p>rickie schrieb:</p>
<blockquote>
<p>Jetzt glaube ich es zu verstehen.</p>
<p>Sobald der Speicher mit dem Befehl new angefordert wird landet das Objekt auf dem Heap, ansonsten auf dem Stack.</p>
<pre><code>[cpp]
class A {};

class B
{
 private:
  A* ptr;
  B { ptr = new A; }
};
[/cpp]
</code></pre>
<p>Herzlichen Dank!</p>
</blockquote>
<p>Übrigens wenn du die Möglichkeit hast auf Zeiger zu verzichten, dann solltest du das unbedingt tun. Denn angeforderten Speicher muss man selbstständig freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882257</guid><dc:creator><![CDATA[ghj]]></dc:creator><pubDate>Tue, 13 Apr 2010 16:02:14 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 16:10:23 GMT]]></title><description><![CDATA[<p>Hab ich nicht bedacht. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882263</guid><dc:creator><![CDATA[rickie]]></dc:creator><pubDate>Tue, 13 Apr 2010 16:10:23 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 16:47:47 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>...Wenn es Bestandteil einer anderen Klasse ist und diese wird dynamisch erzeugt greift meine Aussage ja wieder.<br />
Und wenn ich sage, dass dann die Klasse auf'm heap liegt, dann schließt das logisch alle Member mit ein.</p>
</blockquote>
<p>najaaaaaa:</p>
<pre><code class="language-cpp">class A {};

class B
{
 private:
  A* ptr;
  B(A* a) : ptr(a) {}
};

int main() {
   A a;
   B* b = new B(&amp;a);
...
</code></pre>
<p>:p</p>
<p>Man kann einfach nicht &quot;Pointer = dynamisches Objekterzeugung&quot; schließen.<br />
Ein Zeiger ist lediglich ein Objektverweis und den kann man auf Heap-/Stack-/Sub-/...Objekte zeigen lassen.</p>
<p>Wichtiger ist IMHO die Tatsache, dass die Verweise bei Zeigern auch &quot;umgebogen&quot; werden können (im Gegensatz zu Referenzen) und ins Nirvana zeigen können (was man entsprechend berücksichtigen muss).</p>
<p>Die Aussage</p>
<p>ghj schrieb:</p>
<blockquote>
<p>...<br />
Übrigens wenn du die Möglichkeit hast auf ...[xyz]... zu verzichten, dann solltest du das unbedingt tun. ...</p>
</blockquote>
<p>würde ich in der Variante &quot;[xyz] = manuelle Speicherverwaltung&quot; aber voll und ganz unterstützen.<br />
Und zwar nicht nur wegen der Möglichkeit, delete zu vergessen, sondern auch, weil man mit der Lebenszeit (also auch der Objekterzeugung mit new oder einem zu frühzeitigen delete) Einiges falsch machen kann. Außerdem geraten gerade Anfänger dabei schnell in die Array-Hölle.... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882285</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 13 Apr 2010 16:47:47 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 17:44:36 GMT]]></title><description><![CDATA[<p>rickie schrieb:</p>
<blockquote>
<p>Pointer auf Objekt einbinden:</p>
<pre><code>[cpp]
class A {};

class B
{
 private:
  A* ptr;
};
[/cpp]
</code></pre>
<p>Objekt selbst einbinden:</p>
<pre><code>[cpp]
class A {};

class B
{
 private:
  A a;
};
[/cpp]
</code></pre>
</blockquote>
<p>Ich würde sogar drei Fälle unterscheiden:</p>
<ul>
<li><code>A* pa;</code> -- Ein Objekt vom Typ B <em>kennt</em> höchstens ein Objekt vom Typ A. B ist nicht für die Verwaltung von A zuständig (von wegen Löschen u.s.w.).</li>
<li><code>A* pa;</code> -- Ein Objekt vom Typ B <em>hat</em> höchstens ein Objekt vom Typ A. B ist für die Verwaltung von A zuständig. Das erfordert einen eigenen Destruktor und entweder eigene Kopierkonstruktor + Zuweisungsoperator oder explizites Deaktivieren des Kopierens (siehe <a href="http://de.wikipedia.org/wiki/Dreierregel_%28C%2B%2B%29" rel="nofollow">Dreierregel</a>). <em>Logisch</em> gesehen ist das A-Objekt also ein Datenelement von B. Tatsächlich wird es nur über einen Zeiger erreicht und woanders gespeichert. Das kann praktisch sein, wenn Polymorphie eine Rolle spielt, oder es einen &quot;Leerzustand&quot; geben soll, oder wenn es das Objekt schon gibt und die Verwaltung mit der Erzeugung des B-Objekts übergeben wird. Die Container-Klassen funktionieren ähnlich. Logisch gesehen &quot;enthalten&quot; sie Elemente. Diese werden aber nicht im Objekt selbst gespeichert, sondern wo anders.</li>
<li><code>A a;</code> -- Hier ist das A-Objekt <em>logisch</em> und &quot;<em>physikalisch</em>&quot; ein Datenelement eines B-Objekts. Typischerweise muss man hier keine eigenen Kopierkonstruktoren, Zuweisungsoperatoren und Destruktoren anfertigen. Die Subobjekte werden mit B automatisch zerstört, kopiert und zugewiesen (falls möglich).</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1882327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882327</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 13 Apr 2010 17:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Tue, 13 Apr 2010 20:53:28 GMT]]></title><description><![CDATA[<p>Ein Zeiger<br />
(1) muss nicht schon bei Instanziierung (Constructor) gesetzt werden<br />
(2) kann auch später noch geändert werden und auf andere Objekte verweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882391</guid><dc:creator><![CDATA[einint]]></dc:creator><pubDate>Tue, 13 Apr 2010 20:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied zwischen Memberpointer und -objekt on Wed, 14 Apr 2010 07:36:01 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>...<br />
Ich würde sogar drei Fälle unterscheiden:<br />
...</p>
</blockquote>
<p>Ich finde diese Aufteilung und Erklärung sehr gut!<br />
Es gibt allerdings (leider) in der Realität noch mindestens einen weiteren Fall, der mit</p>
<pre><code>A* pa;
</code></pre>
<p>gemeint sein kann: Dahinter kann sich auch ein Array verbergen (also nicht &quot;höchstens ein&quot;).<br />
Auch wenn ich sowas selbst nicht programmieren würde, ist es doch möglich (und nicht mal selten).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1882496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1882496</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 14 Apr 2010 07:36:01 GMT</pubDate></item></channel></rss>