<?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[initialization in C++03]]></title><description><![CDATA[<p>folgendes Problem:</p>
<p>class C steht in &quot;has-a&quot;-Beziehung mit class A und class B, public inheritance kommt nicht in Frage, private inheritance möchte ich vermeiden.</p>
<pre><code class="language-cpp">class A{ ... };   // ctor might throw
class B{ ... };   // ctor might throw

class C{
  public:
    C(){
      try { A_ = new A(); } catch(...){ ... }
      try { B_1 = new B(); } catch(...){ delete A_; }
      try { B_2 = new B(); } catch(...){ delete B_1; delete A_; }
    }
  private:
    A* A_;
    B* B_1, B_2;
}
</code></pre>
<p>Mir gefallen die delete-Ketten in den Handlern nicht; selbst, wenn man mit goto code duplication vermeiden könnte.</p>
<p>Gibt es bessere Alternativen, z.B. per initializer list (Frage exception safety)? Oder Resource handler, ohne daß ich für B, C copy-ctor implementieren muß (den haben sie nämlich nicht)?</p>
<p>Randbedingungen:<br />
C++03, keine smart pointers, &quot;has-a&quot;-Beziehung (nicht &quot;is-a&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/336045/initialization-in-c-03</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 19:37:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/336045.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Dec 2015 09:49:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 09:49:10 GMT]]></title><description><![CDATA[<p>folgendes Problem:</p>
<p>class C steht in &quot;has-a&quot;-Beziehung mit class A und class B, public inheritance kommt nicht in Frage, private inheritance möchte ich vermeiden.</p>
<pre><code class="language-cpp">class A{ ... };   // ctor might throw
class B{ ... };   // ctor might throw

class C{
  public:
    C(){
      try { A_ = new A(); } catch(...){ ... }
      try { B_1 = new B(); } catch(...){ delete A_; }
      try { B_2 = new B(); } catch(...){ delete B_1; delete A_; }
    }
  private:
    A* A_;
    B* B_1, B_2;
}
</code></pre>
<p>Mir gefallen die delete-Ketten in den Handlern nicht; selbst, wenn man mit goto code duplication vermeiden könnte.</p>
<p>Gibt es bessere Alternativen, z.B. per initializer list (Frage exception safety)? Oder Resource handler, ohne daß ich für B, C copy-ctor implementieren muß (den haben sie nämlich nicht)?</p>
<p>Randbedingungen:<br />
C++03, keine smart pointers, &quot;has-a&quot;-Beziehung (nicht &quot;is-a&quot;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481114</guid><dc:creator><![CDATA[klassenmethode]]></dc:creator><pubDate>Wed, 30 Dec 2015 09:49:10 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 09:58:07 GMT]]></title><description><![CDATA[<p>Warum keine Smart Pointer? Oder warum überhaupt Pointer?</p>
<pre><code>class C
{
public:
  C()  { }
private:
  A a_;
  B B_1;
  B B_2;
};
</code></pre>
<p>So vermeidest Du auch die Notwendigkeit einen Copy-Konstruktor und Assignment-Operator implementieren zu müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481116</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 30 Dec 2015 09:58:07 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 12:27:34 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Warum keine Smart Pointer? Oder warum überhaupt Pointer?</p>
</blockquote>
<p>keine Smartpointer und legacy C++ ist Bedingung. Sonst wäre es ja einfach. Und warum überhaupt Pointer? Weil der ctor von A, B einen parent-Zeiger braucht:</p>
<p>A::A(C* parent) : C_(parent){ ... }<br />
B::B(C* parent) : C_(parent) { ... }</p>
<p>damit fällt in-class init. a la &quot;class C { ... private: A a_; ...}&quot; schon mal weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481128</guid><dc:creator><![CDATA[klassenmethode]]></dc:creator><pubDate>Wed, 30 Dec 2015 12:27:34 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 12:36:17 GMT]]></title><description><![CDATA[<p>Geht doch mit Initializer Lists:</p>
<pre><code>class C
{
public:
  C()
   : a_(this), B_1(this), B_2(this)
  {
  }
private:
  A a_;
  B B_1;
  B B_2;
};
</code></pre>
<p>Oder brauchen die Konstruktoren von A oder B schon ein vollständiges C Objekt?</p>
<p>klassenmethode schrieb:</p>
<blockquote>
<p>keine Smartpointer und legacy C++ ist Bedingung</p>
</blockquote>
<p>Legacy C++ kann ich ja noch verstehen. Ist das irgendeine Programmieraufgabe oder wieso sind Smart Pointer ausgeschlossen? Man kann sich ja auch in C++03 einfach seinen unique_ptr Klon ohne move und andere tolle Tricks schnell selbst bauen. Oder was aus boost nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481129</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 30 Dec 2015 12:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 13:24:24 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Oder brauchen die Konstruktoren von A oder B schon ein vollständiges C Objekt?</p>
</blockquote>
<p>Wäre auch kein Hinderungsgrund. Wenn A oder B deklariert wird, reicht eine forward deklaration von C. Wird der Konstruktor implementiert, dann kann bereits C kennen</p>
<pre><code>class C;  // forward deklaration
class A
{
public:
    explicit A(const C&amp; c);  // hier braucht er definitiv noch kein C
};

class C
{
public:
    C()
        : a_(*this)
    { }
private:
    A a_;
};

A::A(const C&amp; c)
{
  // und hier kennt er das vollständige C Objekt
}
</code></pre>
<p>Zeilen 1-7 gehören normalerweise in &quot;A.h&quot;, 8-17 in &quot;C.cpp&quot; und 18-21 in &quot;A.cpp&quot;</p>
<p>Ach - C-Objekt klingt komisch. Ist doch ein C++-Objekt <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="😉"
    /> . &quot;Objekt vom Typ C&quot; wäre besser. Aber was solls.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481133</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 30 Dec 2015 13:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 13:30:26 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Wäre auch kein Hinderungsgrund. Wenn A oder B deklariert wird, reicht eine forward deklaration von C.</p>
</blockquote>
<p>Sorry, ich meinte vollständig im Sinne von vollständig konstruiert. Wenn der Konstruktor von A eine bereits erfolgte und möglicherweise komplizierte Initialisierung des C Objekts voraussetzt dann möchte man das A Objekt vielleicht erst am Ende des Konstruktors von C aufrufen. Das ist dann nur schwierig mit Initializer Lists zu realisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481137</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 30 Dec 2015 13:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 23:02:54 GMT]]></title><description><![CDATA[<p>initializer list geht nicht, weil wie schon oben geschrieben:</p>
<pre><code class="language-cpp">class A{ ... };   // ctor might throw
class B{ ... };   // ctor might throw
</code></pre>
<p>Daß der ctor von A hingegen ein vollständig initialized C-Objekt benötigt, ist nicht verlangt. Es reicht die Adresse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481190</guid><dc:creator><![CDATA[klassenmethode]]></dc:creator><pubDate>Wed, 30 Dec 2015 23:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 23:14:22 GMT]]></title><description><![CDATA[<p>Und? Lass die doch ne Exception werfen. Die Member werden schon richtig aufgeräumt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481193</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Wed, 30 Dec 2015 23:14:22 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Wed, 30 Dec 2015 23:21:50 GMT]]></title><description><![CDATA[<p>klassenmethode schrieb:</p>
<blockquote>
<p>Mir gefallen die delete-Ketten in den Handlern nicht;</p>
</blockquote>
<p>Mir gefallen die ganzen try/catch Blöcke nicht.</p>
<p>klassenmethode schrieb:</p>
<blockquote>
<p>Gibt es bessere Alternativen [...]</p>
</blockquote>
<p>Ja, Smartpointer</p>
<p>klassenmethode schrieb:</p>
<blockquote>
<p>Randbedingungen:<br />
[...] keine smart pointers [...]</p>
</blockquote>
<p>Mit Verlaub, aber das sind ziemlich bescheuerte Bedingungen, darf man fragen, woher die genau kommen? Wieso überhaupt C++ verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481195</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 30 Dec 2015 23:21:50 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 00:15:00 GMT]]></title><description><![CDATA[<p>@sebi707: kannst du mal zeigen, wie du eine exception aus einer initializer list fängst, die mit</p>
<pre><code class="language-cpp">C::C() : A_(new A(this)), B_1(new B(this)), B_2(new B(this)) {}
</code></pre>
<p>gebaut ist?</p>
<pre><code class="language-cpp">C::C() : A_(A(this)), B_1(B(this)), B_2(B(this)) {}
</code></pre>
<p>will ich ja nicht, weil A und B keinen copy-ctor haben (wäre zu aufwendig)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481199</guid><dc:creator><![CDATA[klassenmethode]]></dc:creator><pubDate>Thu, 31 Dec 2015 00:15:00 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 00:24:35 GMT]]></title><description><![CDATA[<p>klassenmethode schrieb:</p>
<blockquote>
<p>@sebi707: kannst du mal zeigen, wie du eine exception aus einer initializer list fängst, die mit</p>
<pre><code class="language-cpp">C::C() : A_(new A(this)), B_1(new B(this)), B_2(new B(this)) {}
</code></pre>
<p>gebaut ist?</p>
</blockquote>
<p>Das ist nicht, was sebi meint, es sei denn A_, B_1 (und B_2) sind Smartpointer. Falls es Smartpointer sind, gibt es keinen Grund zu fangen.</p>
<p>klassenmethode schrieb:</p>
<blockquote>
<pre><code class="language-cpp">C::C() : A_(A(this)), B_1(B(this)), B_2(B(this)) {}
</code></pre>
<p>will ich ja nicht, weil A und B keinen copy-ctor haben (wäre zu aufwendig)</p>
</blockquote>
<p>dito. Niemand verlangt, dass kopiert werden soll.</p>
<pre><code class="language-cpp">C::C() : A_(this), B_1(this), B_2(this) {}
</code></pre>
<p>ist gut genug.</p>
<p>Wenn neben dem Aufräumen noch etwas anderes im Handler getan werden muss: Stichwort function-try-block</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481200</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 31 Dec 2015 00:24:35 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 00:32:19 GMT]]></title><description><![CDATA[<p>klassenmethode schrieb:</p>
<blockquote>
<p>@sebi707: kannst du mal zeigen, wie du eine exception aus einer initializer list fängst, die mit</p>
<pre><code class="language-cpp">C::C() : A_(new A(this)), B_1(new B(this)), B_2(new B(this)) {}
</code></pre>
<p>gebaut ist?</p>
</blockquote>
<p>Mit einem function-try-block. Das hilft dir aber leider nicht viel, weil du nicht weißt, wo genau die exception flog und welche Member nun aufgeräumt werden müssen. Die einzige, mir bekannte, ordentliche Lösung für all diese Probleme, ist RAII, aber das darf ja aus irgendeinem Grund offenbar nicht verwendet werden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481201</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 31 Dec 2015 00:32:19 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 09:07:40 GMT]]></title><description><![CDATA[<blockquote>
<p>Das hilft dir aber leider nicht viel, weil du nicht weißt, wo genau die exception flog und welche Member nun aufgeräumt werden müssen.</p>
</blockquote>
<p>Im function-try-block wären alle Member schon zerstört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481218</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 31 Dec 2015 09:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 09:24:32 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Das hilft dir aber leider nicht viel, weil du nicht weißt, wo genau die exception flog und welche Member nun aufgeräumt werden müssen.</p>
</blockquote>
<p>Im function-try-block wären alle Member schon zerstört.</p>
</blockquote>
<p>Stimmt. Der Punkt ist, dass alles per new allokierte Memory hier im Falle einer Exception zwangsweise leaked, so lange man keine Smartpointer einsetzt... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2481219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481219</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 31 Dec 2015 09:24:32 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 10:36:41 GMT]]></title><description><![CDATA[<p>Unabhängig davon, dass ich die Lösung ohne Zeiger auch am besten finde:<br />
Der Originalcode lässt sich mit relativ einfachen Mitteln etwas aufhübschen.</p>
<pre><code class="language-cpp">class C{
public:
  C() :
   A_(0), B_1(0), B_2(0)
  {
    try{
      A_=new A();
      B_1=new B();
      B_2=new B();
    }
    catch(...){
      dealloc();
      throw;
    }
  }
private:
  void dealloc() {
    delete A_;
    delete B_1;
    delete B_2;
  }
  ...
  A* A_;
  B* B_1;
  B* B_2;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2481226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481226</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 31 Dec 2015 10:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 11:06:20 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Das hilft dir aber leider nicht viel, weil du nicht weißt, wo genau die exception flog und welche Member nun aufgeräumt werden müssen.</p>
</blockquote>
<p>Im function-try-block wären alle Member schon zerstört.</p>
</blockquote>
<p>Stimmt. Der Punkt ist, dass alles per new allokierte Memory hier im Falle einer Exception zwangsweise leaked, so lange man keine Smartpointer einsetzt... <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>
</blockquote>
<p>Du hast ihn womöglich dazu angeregt, nachzudenken, wie er diese wohl im function-try-block zerstören sollte. Ich wollte nur sicherstellen, dass er diese Idee nicht verfolgt.</p>
<p>Eigentlich sollte ein Artikel zu RAII rauskommen, der wirklich bitter nötig scheint, aber jemand hatte ja über die Feiertage keine Zeit… <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481227</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 31 Dec 2015 11:06:20 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 15:31:29 GMT]]></title><description><![CDATA[<p>Wenn <code>A::A</code> und <code>B::B</code> den <code>C</code> -Zeiger nicht gleich verwenden (=kein vollständig initialisiertes <code>C</code> -Objekt benötigen), dann die Lösung ohne Zeiger</p>
<p><code>C::C() : A_(this), B_1(this), B_2(this) {}</code></p>
<p>Ansonsten Smart-Pointer.<br />
Oder wenigstens eine einfache, kleine Guard-Klasse:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct DeleteGuard
{
    DeleteGuard() : p(0) {}
    ~DeleteGuard() { delete p; }
    T* p;

private:
    DeleteGuard(DeleteGuard const&amp;);
    DeleteGuard&amp; operator = (DeleteGuard const&amp;);
};

class C
{
public:
   C()
   {
      A_.p = new ...;
      B_1.p = new ...;
      B_2.p = new ...;
   }

private:
  DeleteGuard&lt;A&gt; A_;
  DeleteGuard&lt;B&gt; B_1;
  DeleteGuard&lt;B&gt; B_2;
};
</code></pre>
<p>Oder <code>C</code> in zwei Klassen splitten: <code>CBase</code> und <code>C</code> , wobei <code>C</code> von <code>CBase</code> abgeleitet ist.<br />
<code>A</code> und <code>B</code> sind dann Member von <code>C</code> , bekommen aber nur einen <code>CBase</code> -Zeiger. Zu dem Zeitpunkt wo <code>A</code> und <code>B</code> konstruiert werden ist CBase bereits vollständig initialisiert, <code>A</code> und <code>B</code> können also problemlos darauf zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481258</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 31 Dec 2015 15:31:29 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 20:09:33 GMT]]></title><description><![CDATA[<p>ich habe noch mal drüber nachgedacht - was Sebi707 vorgeschlagen hat, scheint mir die beste Lösung</p>
<pre><code class="language-cpp">class C;
class A { 
  public:
    A(C &amp;parent);
    virtual ~A();
  private:
    C &amp;C_;
};

class B {
  public:
    B(C &amp;parent);
    virtual ~B();
  private:
    C &amp;C_;
};

class C
{
  public:
    C();
    virtual ~C();
  private:
    A A_;
    B B1_;
    B B2_;
};

C::C() : A_(*this), B1_(*this), B2_(*this){} 
C::~C(){}

A::A(C &amp;parent) : C_(parent){} 
A::~A(){}

B::B(C &amp;parent) : C_(parent){ throw exception(); } 
B::~B(){}

int main(void){ 
  try { C c; }
  catch(...){ /* ... */ }
}
</code></pre>
<p>hübsch - die delete-Ketten sind weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481283</guid><dc:creator><![CDATA[klassenmethode]]></dc:creator><pubDate>Thu, 31 Dec 2015 20:09:33 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Thu, 31 Dec 2015 23:54:37 GMT]]></title><description><![CDATA[<p>Wieso die ganzen virtuellen Destruktoren? Ich finds auch etwas merkwürdig, dass diese Klassen alle eine Referenz auf das Objekt, dessen Teil sie sind, brauchen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481300</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 31 Dec 2015 23:54:37 GMT</pubDate></item><item><title><![CDATA[Reply to initialization in C++03 on Fri, 01 Jan 2016 02:32:30 GMT]]></title><description><![CDATA[<p>klassenmethode schrieb:</p>
<blockquote>
<p>i</p>
<pre><code class="language-cpp">class C;
class A { 
  public:
    A(C &amp;parent);
    virtual ~A();
  private:
    C &amp;C_;
};

(...)
</code></pre>
</blockquote>
<p>Also hier würde ich wirklich keine Referenz verwenden, sondern einen Zeiger.<br />
Wenn du das Ändern des Zeigers verhindern willst, dann mach die Membervariable einfach <code>const</code> .</p>
<p>Und der virtuelle Dtor ist mMn. auch unnütz. Kann mir grad keine Situation vorstellen wo man den brauchen könnte. Bzw. schlimmer als unnütz: er kommuniziert etwas, was so nicht stimmt. Nämlich dass man sinnvoll von A ableiten kann.</p>
<p>Und dann macht es wohl auch keinen Sinn eine implizite Konvertierung <code>C</code> =&gt; <code>A</code> bzw. <code>C*</code> =&gt; <code>A</code> zu erlauben. Also sollte der Ctor <code>explicit</code> sein.</p>
<p>Also</p>
<pre><code class="language-cpp">class C;
class A { 
  public:
    explicit A(C* parent);
  private:
    C* const C_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2481315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481315</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 01 Jan 2016 02:32:30 GMT</pubDate></item></channel></rss>