<?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[Klassen als Member, Pointer oder nicht, Programmierstil?]]></title><description><![CDATA[<p>Hi,<br />
mal an prinzipielle Frage: Wenn ich Klassen als Member von übergeordneten Klassen habe, gibt es da Kriterien, ob diese als Pointer oder direkt als Membervariablen zu verwenden sind?<br />
Z.B.</p>
<pre><code>class A {
public:
  A(int _init) : wert(_init) 
  {}
  bool b();
privat:
  init wert;
};

class B {
public:
  B(int init);
  ~B() {
     if (pA) delete pA;
  }
  foo() {
     pA = new A(123);
     pA-&gt;b();
  }
private:
  A *pA;
};
</code></pre>
<p>oder so:</p>
<pre><code>class A {
public:
  A();
  void init(int _init);
  bool b();
privat:
  ...
};

class B {
public:
  B(int init);
private:
  foo() {
     a.init(123);
     a.b();
  }
  A a;
};
</code></pre>
<p>Im zweiten Fall kann ich ja nicht über den Konstruktor initialisieren, brauche also eine init()-Methode. Im ersten Fall instantiiere ich die Klasse erst bei der Verwendung und kann sie dann über den Konstruktor initialisieren, muss mich aber später auch um das &quot;delete&quot; kümmern.<br />
Was ist zu bevorzugen? Ist es eine reine Stilfrage oder gibt es klare Kriterien, wann was zu verwenden ist?<br />
Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310942/klassen-als-member-pointer-oder-nicht-programmierstil</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 04:54:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310942.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Nov 2012 07:46:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 07:46:12 GMT]]></title><description><![CDATA[<p>Hi,<br />
mal an prinzipielle Frage: Wenn ich Klassen als Member von übergeordneten Klassen habe, gibt es da Kriterien, ob diese als Pointer oder direkt als Membervariablen zu verwenden sind?<br />
Z.B.</p>
<pre><code>class A {
public:
  A(int _init) : wert(_init) 
  {}
  bool b();
privat:
  init wert;
};

class B {
public:
  B(int init);
  ~B() {
     if (pA) delete pA;
  }
  foo() {
     pA = new A(123);
     pA-&gt;b();
  }
private:
  A *pA;
};
</code></pre>
<p>oder so:</p>
<pre><code>class A {
public:
  A();
  void init(int _init);
  bool b();
privat:
  ...
};

class B {
public:
  B(int init);
private:
  foo() {
     a.init(123);
     a.b();
  }
  A a;
};
</code></pre>
<p>Im zweiten Fall kann ich ja nicht über den Konstruktor initialisieren, brauche also eine init()-Methode. Im ersten Fall instantiiere ich die Klasse erst bei der Verwendung und kann sie dann über den Konstruktor initialisieren, muss mich aber später auch um das &quot;delete&quot; kümmern.<br />
Was ist zu bevorzugen? Ist es eine reine Stilfrage oder gibt es klare Kriterien, wann was zu verwenden ist?<br />
Danke und Gruß!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273683</guid><dc:creator><![CDATA[fu06]]></dc:creator><pubDate>Fri, 23 Nov 2012 07:46:12 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 07:53:18 GMT]]></title><description><![CDATA[<p>Member bzw. Komposition bedeutet &quot;hat ein&quot;.<br />
Pointer bedeutet &quot;kennt ein&quot;.</p>
<p>Bzgl. Deiner These mit init(), google mal nach initialisierungsliste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273686</guid><dc:creator><![CDATA[Initialisierungsliste]]></dc:creator><pubDate>Fri, 23 Nov 2012 07:53:18 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 08:15:51 GMT]]></title><description><![CDATA[<p>fu06 schrieb:</p>
<blockquote>
<p>Im zweiten Fall kann ich ja nicht über den Konstruktor initialisieren, [...]</p>
</blockquote>
<p>Warum nicht ... ?</p>
<p>Wennschon pointer, warum nicht smarte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273697</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Fri, 23 Nov 2012 08:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 10:03:33 GMT]]></title><description><![CDATA[<p>Das funktioniert so eigentlich problemlos: <a href="http://ideone.com/2Uy7jZ" rel="nofollow">http://ideone.com/2Uy7jZ</a><br />
Aber trotzdem fragt man sich, ob das ein durchdachtes Design ist. Auf Anhieb fällt mir nichts ein, wo das sinnvoll sein könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273743</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 23 Nov 2012 10:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 11:01:13 GMT]]></title><description><![CDATA[<p>OK, ich vergass zu sagen, dass ich von C komme und C++ Umsteiger bin...<br />
<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>Swordfish schrieb:</p>
<blockquote>
<p>fu06 schrieb:</p>
<blockquote>
<p>Im zweiten Fall kann ich ja nicht über den Konstruktor initialisieren, [...]</p>
</blockquote>
<p>Warum nicht ... ?</p>
</blockquote>
<p>OK, Denkfehler... mir war unklar, wie ich &quot;a&quot; hier initialisieren soll. Es muss also über die Initialisierungsliste von B erfolgen:</p>
<pre><code>class A {
public:
  A(int _init) : c(_init)
  {}
  void b(void) {
    // ...
  }
private:
  int c;
};

class B {
public:
    B(int _init) : c(_init), a(123)
    {
    }
private:
  void foo(void) {
     a.b();
  }
  A a;
  int c;
};
</code></pre>
<p>bzw. A hat einen Standardkonstruktor ohne Parameter für default-Initalisierungen.</p>
<p>Ist das korrekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273766</guid><dc:creator><![CDATA[fu06]]></dc:creator><pubDate>Fri, 23 Nov 2012 11:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 11:13:30 GMT]]></title><description><![CDATA[<p>fu06 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class B {
public:
  B(int _init) : c(_init), a(123)
  {
  }
  // ...
  A a;
  int c;
};
</code></pre>
</blockquote>
<p>Obacht, dass <code>a</code> vor <code>c</code> im C'tor von <code>B</code> initialisiert wird.<br />
Die Reihenfolge in der Initialisierungsliste ist belanglos. Entscheidend ist die Reihenfolge in der Klassendefinition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273774</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 23 Nov 2012 11:13:30 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 11:19:03 GMT]]></title><description><![CDATA[<p>fu06 schrieb:</p>
<blockquote>
<p>bzw. A hat einen Standardkonstruktor ohne Parameter für default-Initalisierungen.</p>
</blockquote>
<p>Deine Fragen sind etwas wirr... A hat hier definitiv keinen Defaultkonstruktor. Ob einer Sinn macht, kommt auf den Kontext an. Das Objekt selbst sollte nach Ausführung des Konstruktors in einem definierten Zustand bzw. &quot;lebensfähig&quot; sein, ohne dass neue Maßnahmen ergriffen werden müssen. Aber was das genau heißt, ist wiederrum eine andere Frage. Ich denke z.B. dass ein Container oder ein Array nicht dafür zuständig ist seine Elemente zu null-initialisieren. Aber natürlich sollte es allen seinen Membern sinnvolle Werte zuweisen. (Größe, etwaige Pointer, etc.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273778</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 23 Nov 2012 11:19:03 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 11:57:00 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>fu06 schrieb:</p>
<blockquote>
<p>bzw. A hat einen Standardkonstruktor ohne Parameter für default-Initalisierungen.</p>
</blockquote>
<p>Deine Fragen sind etwas wirr... A hat hier definitiv keinen Defaultkonstruktor. Ob einer Sinn macht, kommt auf den Kontext an. Das Objekt selbst sollte nach Ausführung des Konstruktors in einem definierten Zustand bzw. &quot;lebensfähig&quot; sein, ohne dass neue Maßnahmen ergriffen werden müssen. Aber was das genau heißt, ist wiederrum eine andere Frage. Ich denke z.B. dass ein Container oder ein Array nicht dafür zuständig ist seine Elemente zu null-initialisieren. Aber natürlich sollte es allen seinen Membern sinnvolle Werte zuweisen. (Größe, etwaige Pointer, etc.)</p>
</blockquote>
<p>OK, den Defaultkonstruktor habe ich nicht ins Codebeispiel aufgenommen. Und er wird nicht autom. erzeugt, wenn ein anderer deklariert wurde.</p>
<p>Hier nochmal das Beispiel komplett:</p>
<pre><code>class A {
public:
  A(int _init) : c(_init)
  {}
  A(): c(0)
  {}
  void b(void) {
    // ...
  }
private:
  int c;
};

class B {
public:
    B(int _init) : c(_init), a(123)
    {
    }
private:
  void foo(void) {
     a.b();
  }
  A a;
  int c;
};
</code></pre>
<p>Dann kann ich A irgendwo anders auch parameterlos instatiieren. Für B brauche ich es ja nicht, da B::a erst dann erzeugt wird, wenn ein B-Objekt erzeugt wird. Und dies erfolgt immer durch den B(int) Konstruktor, der den A(int) Kontruktor aufruft.<br />
Falls ich was Falsches sage, bitte ich um Korrekturen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273800</guid><dc:creator><![CDATA[fu06]]></dc:creator><pubDate>Fri, 23 Nov 2012 11:57:00 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Fri, 23 Nov 2012 12:40:26 GMT]]></title><description><![CDATA[<p>Warum nicht einfach</p>
<pre><code>A(int init_ = 0)
</code></pre>
<p>? <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="😉"
    /><br />
Abgesehen davon ist der Unterstrich am Anfang einer Variable recht unbeliebt, weil man damit nah an reservierten Bezeichnern ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273835</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 23 Nov 2012 12:40:26 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Sat, 24 Nov 2012 00:06:15 GMT]]></title><description><![CDATA[<p>Pointer machen ja nur die App unsicher. Besser die Finger von lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274095</guid><dc:creator><![CDATA[addt]]></dc:creator><pubDate>Sat, 24 Nov 2012 00:06:15 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen als Member, Pointer oder nicht, Programmierstil? on Sat, 24 Nov 2012 07:55:40 GMT]]></title><description><![CDATA[<p>addt schrieb:</p>
<blockquote>
<p>Pointer machen ja nur die App unsicher. Besser die Finger von lassen.</p>
</blockquote>
<p>das ist der grösste schwachsinn den ich seit langem gelesen habe. und das mit abstand...</p>
<p>fährst du auto?<br />
wenn ja, tanken macht das fahren gefährlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2274111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2274111</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 24 Nov 2012 07:55:40 GMT</pubDate></item></channel></rss>