Struct, members erst nach deklaration...



  • struct town; 
    
    struct street {
      int dist;
      town* toTown;
    }; 
    
    struct town {
      string name;
      street streets[2];
    };
    


  • kaenzign schrieb:

    Natürlich akzeptiert der Compiler die 3te Zeile nicht... Aber gemäss

    struct town {string name; street streets[2];};



  • Danke euch.
    Mir war irgendwie nicht bewusst, dass das zulässig ist.
    Ich meine bei anderen Dateitypen geht das nicht:

    z.B:

    int x;
    int x = 1;
    

    akzeptiert mein Compiler nicht: " »int x« previously declared here|"

    Warum geht das denn bei Structs?



  • bei globalen vatriablen gehts auch

    extern int x;//deklaration
    int x;//definition
    

    und bei funktionen

    void f();//deklaration
    void f(){cout<<"hallo";}//definition
    


  • Einmal machst du nur den Namen bekannt (Deklaration), einmal definierst du, wie das struct genau aussieht.


  • Mod

    Dein int x; beschreibt nicht, wie ein int aussieht, sondern was x ist. Du müsstest das int x; eher mit

    struct foo { /* Irgendein Konstruktor, der Zahlen akzeptiert */ };
    
    foo x;
    foo x = 1; // Geht auch nicht, genau wie bei deinem Beispiel
    

    vergleichen.



  • Ok, jetzt verstehe ich, vielen Dank.

    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:
    "Im Beispiel ist NSTREETS = 2, das Struct soll aber mit beliebigen Werten für NSTREETS zurechtkommen."

    Heisst das, dass man das street array dynamisch alloziieren muss? also:

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

    Habe das so probiert, der compiler meckert dann aber

    Wo liegt das problem?



  • Du solltest schon die Zeile mit MAX posten und sagen, was MAX ist.


  • Mod

    kaenzign schrieb:

    Heisst das, dass man das street array dynamisch alloziieren muss?

    Jain.
    Ja: Das muss dann dynamisch gemacht werden
    Nein: Das macht weder "man" und ganz bestimmt nicht "du", sondern std::vector. Selber new für Arrays zu nutzen ist immer 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).

    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.



  • SeppJ schrieb:

    kaenzign schrieb:

    Heisst das, dass man das street array dynamisch alloziieren muss?

    Jain.
    Nein: Das macht weder "man" und ganz bestimmt nicht "du", sondern std::vector. Selber new für Arrays zu nutzen ist immer 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).

    Hallo SeppJ
    Danke für den Tipp mit der vector Klasse, ich werde mich so bald wie möglich dahintersetzen.
    Die Sache ist nur, dass wir im Studium das noch nicht behandeld haben, und in der Aufgabenstellung verlangt wird, mit einem Array zu arbeiten...
    Desshalb würde ich doch noch gerne wissen, wie das mit einem Array funktionieren würde.

    EDIT:
    hier nochmal der ganze 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;
    }
    

    Der Compiler gibt volgende fehlermeldung aus:
    »NSTREETS« kann nicht in Konstanten-Ausdruck auftreten|
    »new« kann nicht in einem Konstanten-Ausdruck auftreten|
    ISO-C++ verbietet Initialisierung des Elementes »streets« [-fpermissive]|
    »streets« wird statisch gemacht [-fpermissive]|
    ungültige Initialisierung innerhalb der Klasse des statischen Datenelements vom nicht eingebauten Typen »main()::street*«|
    ||=== Build finished: 5 errors, 0 warnings ===|

    Verstehe nicht, wo das problem liegt..



  • Dein Code passt nicht zur Fehlermeldung bzw. ist unvollständig.


Anmelden zum Antworten