<?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[Liste als Klassen-Attribut - Pointer geeignet?]]></title><description><![CDATA[<p>Servus,</p>
<p>es gibt im Buch von Breymann (Der C++-Programmierer)ja eine feine Fragenkette, bei der am Ende die Antwort klar ist, in welcher Form Methoden- bzw. Funktionsparameter gesetzt werden sollten.</p>
<p>Ich suche so etwas für die Attribute meiner Klasse. Wann nehme ich hier const, wann nehme ich vor allem Pointer als Klassenattribute, wie stelle ich dann dabei sicher, dass mir der Pointer auch immer besetzt ist?</p>
<p>Um einmal konkret zu werden: ich habe eine Klasse 'Tisch'. Jetzt hat der Tisch einen vektor&lt;bein&gt; und da ich vielleicht auch Tische mit hunderttausenden von Beinen haben werde, will ich als Attribut gerne einen Pointer zur Liste speichern statt direkt die Liste - wie mache ich das?</p>
<p>Damit mir der Pointer nicht abhaut, habe ich diesen Vektor mit den bein-Instanzen in einem Namespace 'global' angelegt und in die main.cpp geschrieben - somit hoffe ich, dass der Pointer im gesamten Programmablauf besetzt sein wird - lieg ich da richtig?</p>
<p>Danke vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/283234/liste-als-klassen-attribut-pointer-geeignet</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 18:15:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/283234.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Mar 2011 23:56:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Liste als Klassen-Attribut - Pointer geeignet? on Mon, 07 Mar 2011 23:56:03 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>es gibt im Buch von Breymann (Der C++-Programmierer)ja eine feine Fragenkette, bei der am Ende die Antwort klar ist, in welcher Form Methoden- bzw. Funktionsparameter gesetzt werden sollten.</p>
<p>Ich suche so etwas für die Attribute meiner Klasse. Wann nehme ich hier const, wann nehme ich vor allem Pointer als Klassenattribute, wie stelle ich dann dabei sicher, dass mir der Pointer auch immer besetzt ist?</p>
<p>Um einmal konkret zu werden: ich habe eine Klasse 'Tisch'. Jetzt hat der Tisch einen vektor&lt;bein&gt; und da ich vielleicht auch Tische mit hunderttausenden von Beinen haben werde, will ich als Attribut gerne einen Pointer zur Liste speichern statt direkt die Liste - wie mache ich das?</p>
<p>Damit mir der Pointer nicht abhaut, habe ich diesen Vektor mit den bein-Instanzen in einem Namespace 'global' angelegt und in die main.cpp geschrieben - somit hoffe ich, dass der Pointer im gesamten Programmablauf besetzt sein wird - lieg ich da richtig?</p>
<p>Danke vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031054</guid><dc:creator><![CDATA[Jay1980]]></dc:creator><pubDate>Mon, 07 Mar 2011 23:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to Liste als Klassen-Attribut - Pointer geeignet? on Tue, 08 Mar 2011 00:23:28 GMT]]></title><description><![CDATA[<blockquote>
<p>wann nehme ich vor allem Pointer als Klassenattribute, wie stelle ich dann dabei sicher, dass mir der Pointer auch immer besetzt ist?</p>
</blockquote>
<p>Pointer sind besonders in zwei Fällen nötig:<br />
1. Daten können aus irgendeinem Grund nicht auf dem Stack angelegt werden (z.B. ist ein Array von 100000 ints zu groß für den Stack), sind aber fester Bestandteil des Objekts. In diesem Fall setzt man dann RAII ein, d.h. man fordert innerhalb des Konstruktors den Speicherplatz an und setzt den Pointer, im Destruktor gibt man die Daten wieder frei.</p>
<p>2. Das Objekt kann auch unabhängig vom Pointee funktionieren, zwischen Pointee und Zeiger besteht also nur eine lose Verbindung. Vor allem kann der Zeiger auch 0 sein (also nicht gesetzt).</p>
<p>Es gibt natürlich noch andere Fälle, in denen Zeiger als Membervariablen angemessen sind - man muss sich halt immer von Fall zu Fall Gedanken machen.</p>
<blockquote>
<p>Jetzt hat der Tisch einen vektor&lt;bein&gt; und da ich vielleicht auch Tische mit hunderttausenden von Beinen haben werde, will ich als Attribut gerne einen Pointer zur Liste speichern statt direkt die Liste</p>
</blockquote>
<p>Brauchst du nicht. std::vector verwaltet seine Elemente im Heap (!= Stack), d.h. es ist absolut problemlos möglich auch einen Vektor mit 1000 Elementen als Membervariable zu haben.</p>
<blockquote>
<p>wie mache ich das?</p>
</blockquote>
<p>Wenn du wirklich einen Pointer zu einer std::list&lt;bein&gt; haben möchtest, dann hast du halt einen Member <code>std::list&lt;bein&gt;* m_beine</code> .</p>
<blockquote>
<p>Damit mir der Pointer nicht abhaut, habe ich diesen Vektor mit den bein-Instanzen in einem Namespace 'global' angelegt und in die main.cpp geschrieben - somit hoffe ich, dass der Pointer im gesamten Programmablauf besetzt sein wird - lieg ich da richtig?</p>
</blockquote>
<p>Versuche globale Variablen zu vermeiden. Wie oben geschrieben kann der Vektor auch ruhig Attribut der Klasse sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031058</guid><dc:creator><![CDATA[Irgendwer]]></dc:creator><pubDate>Tue, 08 Mar 2011 00:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to Liste als Klassen-Attribut - Pointer geeignet? on Tue, 08 Mar 2011 08:17:50 GMT]]></title><description><![CDATA[<p>Jay1980 schrieb:</p>
<blockquote>
<p>Um einmal konkret zu werden: ich habe eine Klasse 'Tisch'. Jetzt hat der Tisch einen vektor&lt;bein&gt; und da ich vielleicht auch Tische mit hunderttausenden von Beinen haben werde, will ich als Attribut gerne einen Pointer zur Liste speichern statt direkt die Liste</p>
</blockquote>
<p>Diese Argumentation verstehe ich nicht. Es klingt so, als würdest Du glauben, dass ein Objekt des folgenden Typs...</p>
<pre><code class="language-cpp">class Tisch
{
  vector&lt;Bein&gt; beine;
  ...
};
</code></pre>
<p>...nicht mehrere Beine besitzen könnte.</p>
<p>Jay1980 schrieb:</p>
<blockquote>
<p>[...] lieg ich da richtig?</p>
</blockquote>
<p>Hä? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Zusatz:<br />
Dein Thread-Titel ist &quot;List als Klasse-Attribut, pointer geeignet?&quot;. Es ist mir nicht ganz klar, wie der erste Teil der Frage mit dem zweiten Teil zusammen hängt. Wenn Du einen Zeiger als Klassenattribut verwendest, ist das ein Zeiger und kein Vector oder keine Liste. Es gibt im Prinzip drei Kombinationen, wie man Objektbeziehungen modellieren und implementieren kann.</p>
<p>1. ein X ist ein Teil von einem Y (logisch und auch implementierungs-technisch):</p>
<pre><code class="language-cpp">class Y {
  X teil;
};
</code></pre>
<p>2. ein Y <em>kennt</em> ein X. Implementierung über Zeiger</p>
<pre><code class="language-cpp">class Y {
  X* bekannter;
};
</code></pre>
<p>3. ein X ist <em>logisch gesehen</em> ein Teil von einem Y. Eine Implementierung per Zeiger erfordert das Abschalten oder Überschreiben der Default-Kopiersemantik, da ein Zeiger mit der Default-Kopiersemantik nur eine &quot;kennt-ein&quot;-Beziehung modelliert:</p>
<pre><code class="language-cpp">class Y {
  X* logischer_teil;
public:
  Y() : logischer_teil(new X) {}
  Y(Y const&amp;);
  Y&amp; operator=(Y const&amp;);
  ~Y();
};
</code></pre>
<p>Wenn Du jetzt nur Weg 3 wählen willst, weil ein Y dynamisch viele Xs haben können soll, dann kannst Du entweder Weg 1 mit einem vector&lt;bein&gt; wählen oder Du programmierst Dir einen vektor innerhalb von Y mit Weg 3 nach (würde ich von abraten). Also, falls Du um um Fall 3 rumkommst, tue es.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031074</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 08 Mar 2011 08:17:50 GMT</pubDate></item></channel></rss>