<?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[Nested Class: Declaration und Definition trennen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Problem:<br />
Ich möchte mehrere Nested Klassen in einer Klasse deklarieren und erst danach definieren, jedoch benötige ich von den Nested Klassen jeweils einen Member in der Umschliessenden Klasse, im g++ 4.2.4 bekomme ich dann allerdings die Fehlermeldung:<br />
<code>error: field 'x' has incomplete type</code></p>
<p>Einfaches Example:</p>
<pre><code class="language-cpp">class Outer {
    Outer(){};
    ~Outer(){};
protected:
    class Nested1;
    class Nested2;
    Nested1 x;
    Nested2 y;
};

class Outer::Nested1{
    int x;
};

class Outer::Nested2{
    char z;
};

int main() {
    Outer a;
}
</code></pre>
<p>Habe ich da etwas falsch verstanden? Im Dokument n2798.pdf zum C++0x ist unter 9.7.3 ein ähnliches Example und an der Stelle sollte sich doch nichts geändert haben zum aktuellen Standard?</p>
<p>Viele Grüße<br />
Nested</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226582/nested-class-declaration-und-definition-trennen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 18:27:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226582.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Nov 2008 10:47:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 10:47:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Problem:<br />
Ich möchte mehrere Nested Klassen in einer Klasse deklarieren und erst danach definieren, jedoch benötige ich von den Nested Klassen jeweils einen Member in der Umschliessenden Klasse, im g++ 4.2.4 bekomme ich dann allerdings die Fehlermeldung:<br />
<code>error: field 'x' has incomplete type</code></p>
<p>Einfaches Example:</p>
<pre><code class="language-cpp">class Outer {
    Outer(){};
    ~Outer(){};
protected:
    class Nested1;
    class Nested2;
    Nested1 x;
    Nested2 y;
};

class Outer::Nested1{
    int x;
};

class Outer::Nested2{
    char z;
};

int main() {
    Outer a;
}
</code></pre>
<p>Habe ich da etwas falsch verstanden? Im Dokument n2798.pdf zum C++0x ist unter 9.7.3 ein ähnliches Example und an der Stelle sollte sich doch nichts geändert haben zum aktuellen Standard?</p>
<p>Viele Grüße<br />
Nested</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609337</guid><dc:creator><![CDATA[nested]]></dc:creator><pubDate>Mon, 03 Nov 2008 10:47:58 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 10:56:48 GMT]]></title><description><![CDATA[<p>Unterstützt das denn der GCC deiner Version?<br />
Lad sonst mal die neuste Version runter:<br />
<a href="http://gcc.gnu.org/" rel="nofollow">http://gcc.gnu.org/</a></p>
<p>Unterstützen <strong>muss</strong> er das ja noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609343</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 03 Nov 2008 10:56:48 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 10:57:10 GMT]]></title><description><![CDATA[<p>Zu dem Zeitpunkt wo du Variablen (oder Member) einer Klasse deklarierst muss bereits die vollständige Definition der Klasse vorliegen. Anders ists, wenn du nur Pointer oder Referenzen auf ein Objekt der Klasse hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609344</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Nov 2008 10:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 11:15:34 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Zu dem Zeitpunkt wo du Variablen (oder Member) einer Klasse deklarierst muss bereits die vollständige Definition der Klasse vorliegen. Anders ists, wenn du nur Pointer oder Referenzen auf ein Objekt der Klasse hast.</p>
</blockquote>
<p>Ups, ja stimmt natürlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Ich wollte die Deklaration und Definition halt trennen um die Übersichtlichkeit in der Outer-Klasse zu wahren. Bleibt mir an der Stelle nichts anderes übrig als es innerhalb zu definieren oder mit shared_pointern zu arbeiten.</p>
<p>Danke jedenfalls <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@Drakon</a>: ich habe leider den aktuellen Standard momentan nicht zur Hand und da alle Änderungen in n2798 farblich markiert sind, dachte ich es sei im aktuellen Standard an der Stelle identisch. Mea culpa <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609353</guid><dc:creator><![CDATA[nested]]></dc:creator><pubDate>Mon, 03 Nov 2008 11:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 11:37:20 GMT]]></title><description><![CDATA[<p>die farbigen teile in n2798 sind nur diejenigen, die der editor seit dem letzten meeting neu eingearbeitet hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609363</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Mon, 03 Nov 2008 11:37:20 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 12:20:05 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>die farbigen teile in n2798 sind nur diejenigen, die der editor seit dem letzten meeting neu eingearbeitet hat.</p>
</blockquote>
<p>Hätte mir eigentlich klar sein sollen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> macht ja auch am meisten Sinn!</p>
<p>aber nochmal zum Thema ich kann doch die Forward-Deklaration verwenden, wenn ich die Member als Pointer (shared_ptr&lt;&gt;) verwende, empfiehlt es sich die Nested-Klassen dann in eine separate Header-Datei zu schreiben? Was würdet ihr empfehlen?</p>
<p>Gruß und Danke<br />
Nested</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609381</guid><dc:creator><![CDATA[nested]]></dc:creator><pubDate>Mon, 03 Nov 2008 12:20:05 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 12:29:00 GMT]]></title><description><![CDATA[<p>nested schrieb:</p>
<blockquote>
<p>aber nochmal zum Thema ich kann doch die Forward-Deklaration verwenden, wenn ich die Member als Pointer (shared_ptr&lt;&gt;) verwende, empfiehlt es sich die Nested-Klassen dann in eine separate Header-Datei zu schreiben? Was würdet ihr empfehlen?</p>
</blockquote>
<p>Sollen die Nested-Klassen in abgeleiteten Klassen (und protected deuted darauf hin das du Outer als Basisklasse verwendest) bekannt sein? Wenn ja ist die Separierung weniger geeignet.</p>
<p>Wenn du aber, wie von mir recht häufig gesehen, protected einfach nur zu verschwenderisch verwendest (für mich ist private Standard, liegt auch daran das ich flache Vererbungshierachien bevorzuge), würde ich gar die ganze Implementierung über das Handle-Body Idiom auslagern und die Nested Klassen als Implementierungsdetail garnicht in der sichtbaren Schnittstelle bekannt machen.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609387</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 03 Nov 2008 12:29:00 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 12:34:01 GMT]]></title><description><![CDATA[<p>nested schrieb:</p>
<blockquote>
<p>wenn ich die Member als Pointer (shared_ptr&lt;&gt;) verwende, empfiehlt es sich die Nested-Klassen dann in eine separate Header-Datei zu schreiben? Was würdet ihr empfehlen?</p>
</blockquote>
<p>Wenn du sie wie in deinem Code protected machen willst, sollten die Deklarationen in den gleichen Header, damit ableitende Klassen Zugriff darauf haben. Wenn sie private sind sollten die Deklarationen in das .cpp file, da es dann Implementationsdetails sind und niemand sonst Zugriff drauf benötigt.<br />
Die Deklarationen in eine gesonderte Headerdatei auszulagern halte ich nicht unbedingt für sinnvoll, da ableitende Klassen den sonst immer in die -cpp einbinden müssten, wenn sie etwas mit den beiden membern anstellen wollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609391</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Nov 2008 12:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 13:10:54 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Sollen die Nested-Klassen in abgeleiteten Klassen (und protected deuted darauf hin das du Outer als Basisklasse verwendest) bekannt sein? Wenn ja ist die Separierung weniger geeignet.</p>
</blockquote>
<p>Nein, es soll nicht abgeleitet werden von Outer. Es handelt sich bei Outer um eine Klasse für einen Assistenten (Wizard) und bei den Nested-Klassen um die einzelnen Pages.</p>
<p>asc schrieb:</p>
<blockquote>
<p>Wenn du aber, wie von mir recht häufig gesehen, protected einfach nur zu verschwenderisch verwendest (für mich ist private Standard, liegt auch daran das ich flache Vererbungshierachien bevorzuge), würde ich gar die ganze Implementierung über das Handle-Body Idiom auslagern und die Nested Klassen als Implementierungsdetail garnicht in der sichtbaren Schnittstelle bekannt machen.</p>
<p>cu André</p>
</blockquote>
<p>Ja du hast Recht, an der Stelle ist das protected wirklich verschwenderisch. Ich selber versuche auch nur Vererbung einzusetzen wenn es wirklich sein muss (momentan muss ich es oft machen, da ich GUI entwickeln muss <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> ), da meiner Meinung nach flache Hierachien schöner sind <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 />
Aber ich habe da eine Frage, verwendest du dann immer das Handle-Body Idiom für den private-Teil?</p>
<p>Gruß<br />
Nested</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609412</guid><dc:creator><![CDATA[nested]]></dc:creator><pubDate>Mon, 03 Nov 2008 13:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Nested Class: Declaration und Definition trennen? on Mon, 03 Nov 2008 14:46:30 GMT]]></title><description><![CDATA[<p>nested schrieb:</p>
<blockquote>
<p>Ja du hast Recht, an der Stelle ist das protected wirklich verschwenderisch.</p>
</blockquote>
<p>Grundsätzlich habe ich mir die Regel gemacht:<br />
Default ist private, protected verwende ich Grundsätzlich erst wenn ich<br />
a) weiß das ich mit Vererbung arbeite<br />
und<br />
b) die Methode nochmal auf Sinn in einer Vererbung überprüft habe</p>
<p>nested schrieb:</p>
<blockquote>
<p>Ich selber versuche auch nur Vererbung einzusetzen wenn es wirklich sein muss (momentan muss ich es oft machen, da ich GUI entwickeln muss <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> ),</p>
</blockquote>
<p>Ich sehe keinen Zusammenhang zwischen UI-Entwicklung und Vererbung.</p>
<p>nested schrieb:</p>
<blockquote>
<p>Aber ich habe da eine Frage, verwendest du dann immer das Handle-Body Idiom für den private-Teil?</p>
</blockquote>
<p>Nein.</p>
<p>Ich verwende das Handle-Body Idiom dann, wenn ich ein aufwendigeres Include dadurch verschieben kann oder die Komplexität wie in deinen Fall höher ist, weil z.B. Innere Klassen verwendet werden.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609495</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 03 Nov 2008 14:46:30 GMT</pubDate></item></channel></rss>