<?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[Warum funktioniert das? Struct im Struct...]]></title><description><![CDATA[<pre><code class="language-cpp">struct letter{
	struct partofword *p;
	int valid;
};

struct partofword{
	struct letter L[26];
};
</code></pre>
<p>Generell, wieso funktioniert sowas?<br />
Im ersten Struct lege ich ja vom Typ partofword an, aber der wird ja erst noch erstellt...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222238/warum-funktioniert-das-struct-im-struct</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 06:54:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222238.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Sep 2008 17:55:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum funktioniert das? Struct im Struct... on Tue, 09 Sep 2008 17:55:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct letter{
	struct partofword *p;
	int valid;
};

struct partofword{
	struct letter L[26];
};
</code></pre>
<p>Generell, wieso funktioniert sowas?<br />
Im ersten Struct lege ich ja vom Typ partofword an, aber der wird ja erst noch erstellt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579389</guid><dc:creator><![CDATA[haider]]></dc:creator><pubDate>Tue, 09 Sep 2008 17:55:22 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert das? Struct im Struct... on Tue, 09 Sep 2008 17:58:02 GMT]]></title><description><![CDATA[<p><strong>Es geht gar nicht.</strong></p>
<p>Zumindest nicht ohne Vorwärtsdeklaration, die den Typen bekannt macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579391</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Sep 2008 17:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to Warum funktioniert das? Struct im Struct... on Tue, 09 Sep 2008 18:21:15 GMT]]></title><description><![CDATA[<p>haider schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct letter{
	struct partofword *p;
	int valid;
};

struct partofword{
	struct letter L[26];
};
</code></pre>
<p>Generell, wieso funktioniert sowas?<br />
Im ersten Struct lege ich ja vom Typ partofword an, aber der wird ja erst noch erstellt...</p>
</blockquote>
<p>Im struct letter wird p als Zeiger auf das struct partofword definiert. Zeigertypen sind immer vollständig, auch wenn es der Typ, auf den gezeigt wird, ggf. nicht ist.<br />
Diese Form der Deklaration sollte in C++ allerdings besser vermieden werden, weil die Bedeutung von der Reihenfolge der Deklarationen abhängt:<br />
(1)</p>
<pre><code class="language-cpp">struct partofword{
	struct letter L[26];
};

struct letter{
	struct partofword *p; // hier wird partofword durch unqualifiziertes lookup im umschließenden Namensraum gefunden
                              // und p zeigt auf diese zuvor definierte Klasse
	int valid;
};
</code></pre>
<p>(2)</p>
<pre><code class="language-cpp">struct partofword;    // Vorwärtsdeklaration
struct letter{
	struct partofword *p; // hier wird partofword durch unqualifiziertes lookup im umschließenden Namensraum gefunden
                              // und p zeigt auf diese noch nicht definierte Klasse
	int valid;
};

struct partofword{            // hiermit wird die Klasse, auf die letter::p zeigt definiert
	struct letter L[26];
};
</code></pre>
<p>(3)</p>
<pre><code class="language-cpp">struct letter{
	struct partofword *p; // partofword kann NICHT durch unqualifiziertes lookup gefunden werden
                              // es wird somit die Klasse letter::partofword deklartiert und ein Zeiger auf diese Klasse definiert
// das ist ganz analog zu
// struct foo { ... } foo_objekt;
// bei der Typ und Objekt in einer Deklaration definiert werden
	int valid;
};

struct partofword{            // definiert die Klasse partofword, die mit der Klasse letter::partofword nichts zu tun hat
	struct letter L[26];
};
</code></pre>
<pre><code class="language-cpp">struct foo bar;
</code></pre>
<p>führt den Namen foo im jeweiligen Scope genau dann ein, wenn foo nicht durch unqualifiziertes Lookup gefunden werden kann. Im Gegensatz dazu bewirkt</p>
<pre><code class="language-cpp">struct foo;
</code></pre>
<p>immer eine solche Injektion des Namens und</p>
<pre><code class="language-cpp">foo bar;
</code></pre>
<p>nie. Hier besteht also eine Inkompatibilität mit C, wenn die betreffende Deklaration in einer Klassendefinition auftaucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579400</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 09 Sep 2008 18:21:15 GMT</pubDate></item></channel></rss>