<?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[Struct, members erst nach deklaration...]]></title><description><![CDATA[<p>Hallo miteinander</p>
<p>Ist es möglich ein struct vorerst ohne member-Variablen zu deklarieren, und erst ein paar Zeilen später die Members zu bestimmen?</p>
<p>Bin gerade dabei die folgende Aufgabe zu lösen:</p>
<p>&quot;(5 Punkte) Der Strassen-Graph besteht aus zwei Grundelementen,<br />
town und street, die in der obigen Abbildung als rechteckige<br />
Tabellen dargestellt sind. Implementieren Sie diese als structs.<br />
Eine Stadt hat einen Namen und ein Array streets mit<br />
NSTREETS ausgehenden Strassen. Im Beispiel ist NSTREETS = 2,<br />
das Struct soll aber mit beliebigen Werten für NSTREETS<br />
zurechtkommen. Ausserdem gibt es ein Flag visited, dessen<br />
Bedeutung später ersichtlich wird. Eine Strasse hat eine<br />
bestimmte Länge und einen Link auf die Stadt, zu der sie führt.<br />
<strong>Durch die zirkuläre Abhängigkeit der beiden Strukturen ist es nötig,<br />
die eine vor der Definition der anderen zu deklarieren:</strong><br />
<em>struct town;</em><br />
Definieren Sie also erst street und anschliessend town.<br />
<em>const int NSTREETS = 2;<br />
// hier Code einfügen</em></p>
<p>Die eintscheidende Stelle habe ich fett markiert.<br />
Das problem ist ja, dass das struct town ein array von &quot;street&quot; structs beinhalted, und umgekehrt das struct &quot;street&quot; ein pointer auf &quot;town&quot; beinhaltet.<br />
Wenn man nun also town (inkl. members) zuerst deklariert reklamiert der compiler, da er &quot;street&quot; noch nicht kennt...<br />
Wie löst man das problem? (ich war bisher der ansicht, dass die deklaration der members sofort geschehen muss...)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312968/struct-members-erst-nach-deklaration</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 11:57:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312968.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Jan 2013 13:14:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 13:14:59 GMT]]></title><description><![CDATA[<p>Hallo miteinander</p>
<p>Ist es möglich ein struct vorerst ohne member-Variablen zu deklarieren, und erst ein paar Zeilen später die Members zu bestimmen?</p>
<p>Bin gerade dabei die folgende Aufgabe zu lösen:</p>
<p>&quot;(5 Punkte) Der Strassen-Graph besteht aus zwei Grundelementen,<br />
town und street, die in der obigen Abbildung als rechteckige<br />
Tabellen dargestellt sind. Implementieren Sie diese als structs.<br />
Eine Stadt hat einen Namen und ein Array streets mit<br />
NSTREETS ausgehenden Strassen. Im Beispiel ist NSTREETS = 2,<br />
das Struct soll aber mit beliebigen Werten für NSTREETS<br />
zurechtkommen. Ausserdem gibt es ein Flag visited, dessen<br />
Bedeutung später ersichtlich wird. Eine Strasse hat eine<br />
bestimmte Länge und einen Link auf die Stadt, zu der sie führt.<br />
<strong>Durch die zirkuläre Abhängigkeit der beiden Strukturen ist es nötig,<br />
die eine vor der Definition der anderen zu deklarieren:</strong><br />
<em>struct town;</em><br />
Definieren Sie also erst street und anschliessend town.<br />
<em>const int NSTREETS = 2;<br />
// hier Code einfügen</em></p>
<p>Die eintscheidende Stelle habe ich fett markiert.<br />
Das problem ist ja, dass das struct town ein array von &quot;street&quot; structs beinhalted, und umgekehrt das struct &quot;street&quot; ein pointer auf &quot;town&quot; beinhaltet.<br />
Wenn man nun also town (inkl. members) zuerst deklariert reklamiert der compiler, da er &quot;street&quot; noch nicht kennt...<br />
Wie löst man das problem? (ich war bisher der ansicht, dass die deklaration der members sofort geschehen muss...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2290984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2290984</guid><dc:creator><![CDATA[kaenzign]]></dc:creator><pubDate>Fri, 18 Jan 2013 13:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 13:19:26 GMT]]></title><description><![CDATA[<p>Das Zauberwort für Google heißt &quot;forward declaration&quot;.</p>
<p>Also ja, das ist möglich. mit der Zeile</p>
<pre><code class="language-cpp">struct town;
</code></pre>
<p>sagt du dem Compiler, dass es irgendwo ein struct mit dem Namen &quot;town&quot; existiert. Bis zur Definition des structs kannst du es zwar nicht verwenden, aber du kannst zumindest Pointer/Referenzen als Member oder Funktionsparameter definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2290985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2290985</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Fri, 18 Jan 2013 13:19:26 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 13:19:42 GMT]]></title><description><![CDATA[<p>Du kannst das struct nicht ohne Member definieren und dich später umentschieden. Aber du kannst jederzeit deklarieren, dass es ein bestimmtes struct gibt, ohne zu definieren, wie es genau aussieht:</p>
<pre><code>struct foo;
</code></pre>
<p>Für sehr viele Anwendungen, insbesondere für Pointer und Referenzen auf das struct, ist eine solche Deklaration (forward-declaration) ausreichend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2290986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2290986</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 18 Jan 2013 13:19:42 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 13:51:54 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du kannst das struct nicht ohne Member definieren und dich später umentschieden.</p>
</blockquote>
<p>Aber genau das wird doch in der Aufgabenstellung verlangt oder nicht?</p>
<p>Also der code müsste irgendwie so aussehen:</p>
<p>struct town;</p>
<p>struct street {int dist; town* toTown;};</p>
<p><em>town {string name; street streets[2];};</em></p>
<p>Natürlich akzeptiert der Compiler die 3te Zeile nicht... Aber gemäss Aufgabenstellung muss es ja irgendwie gehen..<br />
wie macht man das jetzt genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291004</guid><dc:creator><![CDATA[kaenzign]]></dc:creator><pubDate>Fri, 18 Jan 2013 13:51:54 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 13:56:25 GMT]]></title><description><![CDATA[<pre><code>struct town; 

struct street {
  int dist;
  town* toTown;
}; 

struct town {
  string name;
  street streets[2];
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2291006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291006</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 18 Jan 2013 13:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 13:57:01 GMT]]></title><description><![CDATA[<p>kaenzign schrieb:</p>
<blockquote>
<p>Natürlich akzeptiert der Compiler die 3te Zeile nicht... Aber gemäss</p>
</blockquote>
<p><strong>struct</strong> <em>town {string name; street streets[2];};</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291007</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 18 Jan 2013 13:57:01 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 14:14:07 GMT]]></title><description><![CDATA[<p>Danke euch.<br />
Mir war irgendwie nicht bewusst, dass das zulässig ist.<br />
Ich meine bei anderen Dateitypen geht das nicht:</p>
<p>z.B:</p>
<pre><code>int x;
int x = 1;
</code></pre>
<p>akzeptiert mein Compiler nicht: &quot; »int x« previously declared here|&quot;</p>
<p>Warum geht das denn bei Structs?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291011</guid><dc:creator><![CDATA[kaenzign]]></dc:creator><pubDate>Fri, 18 Jan 2013 14:14:07 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 14:18:25 GMT]]></title><description><![CDATA[<p>bei globalen vatriablen gehts auch</p>
<pre><code>extern int x;//deklaration
int x;//definition
</code></pre>
<p>und bei funktionen</p>
<pre><code>void f();//deklaration
void f(){cout&lt;&lt;&quot;hallo&quot;;}//definition
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2291013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291013</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 18 Jan 2013 14:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 14:29:17 GMT]]></title><description><![CDATA[<p>Einmal machst du nur den Namen bekannt (Deklaration), einmal definierst du, wie das struct genau aussieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291014</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 18 Jan 2013 14:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 14:35:19 GMT]]></title><description><![CDATA[<p>Dein <code>int x;</code> beschreibt nicht, wie ein int aussieht, sondern was x ist. Du müsstest das <code>int x;</code> eher mit</p>
<pre><code>struct foo { /* Irgendein Konstruktor, der Zahlen akzeptiert */ };

foo x;
foo x = 1; // Geht auch nicht, genau wie bei deinem Beispiel
</code></pre>
<p>vergleichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291015</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 18 Jan 2013 14:35:19 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 20:03:35 GMT]]></title><description><![CDATA[<p>Ok, jetzt verstehe ich, vielen Dank.</p>
<p>Ohne jetzt extra dafür einen neuen Thread aufmachen zu wollen hätte ich doch noch eine kleine Frage zu der oben bescheriebenen Aufgabenstellung, genauer zu folgender Anmerkung:<br />
&quot;Im Beispiel ist NSTREETS = 2, <strong>das Struct soll aber mit beliebigen Werten für NSTREETS zurechtkommen</strong>.&quot;</p>
<p>Heisst das, dass man das street array dynamisch alloziieren muss? also:</p>
<pre><code>int NSTREETS = 2;

  struct town {
  string name;
  street* streets = new street[NSTREETS];
};
</code></pre>
<p>Habe das so probiert, der compiler meckert dann aber</p>
<p>Wo liegt das problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291025</guid><dc:creator><![CDATA[kaenzign]]></dc:creator><pubDate>Fri, 18 Jan 2013 20:03:35 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 15:07:38 GMT]]></title><description><![CDATA[<p>Du solltest schon die Zeile mit MAX posten und sagen, was MAX ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291027</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 18 Jan 2013 15:07:38 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 15:33:27 GMT]]></title><description><![CDATA[<p>kaenzign schrieb:</p>
<blockquote>
<p>Heisst das, dass man das street array dynamisch alloziieren muss?</p>
</blockquote>
<p>Jain.<br />
<strong>Ja</strong>: Das muss dann dynamisch gemacht werden<br />
<strong>Nein</strong>: Das macht weder &quot;man&quot; und ganz bestimmt nicht &quot;du&quot;, sondern std::vector. Selber new für Arrays zu nutzen ist <strong>immer</strong> die viel schlechtere Alternative zu vector, es hat nicht einmal einen einzigen Vorteil (denn vector macht effektiv das gleiche), dafür zahlreiche Nachteile (man kann sehr vieles daran sehr leicht falsch machen, vector macht garantiert alles richtig).</p>
<p>Der Punkt, dass man bei manueller Speicherverwaltung sehr leicht viel falsch machen kann, gilt natürlich doppelt, wenn man noch Anfänger ist und sich mit den Grundlagen schwer tut. Also unbedingt mal vector angucken, falls noch nicht bekannt. Das ist die wohl wichtigste und meistgenutzte Klasse(nvorlage) der Standardbibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291035</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 18 Jan 2013 15:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 19:54:12 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>kaenzign schrieb:</p>
<blockquote>
<p>Heisst das, dass man das street array dynamisch alloziieren muss?</p>
</blockquote>
<p>Jain.<br />
<strong>Nein</strong>: Das macht weder &quot;man&quot; und ganz bestimmt nicht &quot;du&quot;, sondern std::vector. Selber new für Arrays zu nutzen ist <strong>immer</strong> die viel schlechtere Alternative zu vector, es hat nicht einmal einen einzigen Vorteil (denn vector macht effektiv das gleiche), dafür zahlreiche Nachteile (man kann sehr vieles daran sehr leicht falsch machen, vector macht garantiert alles richtig).</p>
</blockquote>
<p>Hallo SeppJ<br />
Danke für den Tipp mit der vector Klasse, ich werde mich so bald wie möglich dahintersetzen.<br />
Die Sache ist nur, dass wir im Studium das noch nicht behandeld haben, und in der Aufgabenstellung verlangt wird, mit einem Array zu arbeiten...<br />
Desshalb würde ich doch noch gerne wissen, wie das mit einem Array funktionieren würde.</p>
<p>EDIT:<br />
hier nochmal der ganze code:</p>
<pre><code>int main()
{

struct town;

struct street
{
    int dist;
    town* toTown;
};

int NSTREETS = 2;

struct town
{
    string name;
    street* streets = new street[NSTREETS];
};

    return 0;
}
</code></pre>
<p>Der Compiler gibt volgende fehlermeldung aus:<br />
»NSTREETS« kann nicht in Konstanten-Ausdruck auftreten|<br />
»new« kann nicht in einem Konstanten-Ausdruck auftreten|<br />
ISO-C++ verbietet Initialisierung des Elementes »streets« [-fpermissive]|<br />
»streets« wird statisch gemacht [-fpermissive]|<br />
ungültige Initialisierung innerhalb der Klasse des statischen Datenelements vom nicht eingebauten Typen »main()::street*«|<br />
||=== Build finished: 5 errors, 0 warnings ===|</p>
<p>Verstehe nicht, wo das problem liegt..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291133</guid><dc:creator><![CDATA[kaenzign]]></dc:creator><pubDate>Fri, 18 Jan 2013 19:54:12 GMT</pubDate></item><item><title><![CDATA[Reply to Struct, members erst nach deklaration... on Fri, 18 Jan 2013 19:00:11 GMT]]></title><description><![CDATA[<p>Dein Code passt nicht zur Fehlermeldung bzw. ist unvollständig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2291144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2291144</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 18 Jan 2013 19:00:11 GMT</pubDate></item></channel></rss>