Mehrdimensionales Feldarray eines Klassentyps definieren



  • Guten Abend,

    in der h-datei hab ich

    BasicRectangle feld[3][2] geschrieben. Ich will ein Feld von Instanzen aus BasicRectangles, einer von mir definierten Klasseerzeugen. Diese Klasse hat neben dem Standardkonstruktor auch einen mit Parametern.

    In der cpp datei hab ich dann

    for(int k=0;k<=2;k++)
    {
    for(int j=0;j<=1;j++)
    {
    feld[k][j]= new BasicRectangle(j,k,this,maxValueInField);
    }
    }

    was hab ich falsch gemacht?

    PS: Als Fehler kommen zwei Stück:

    Fehler: Fehlender Typspezifizierer- int wird angenommen

    und Fehlender Bezeichner ; vor Bezeichner feld

    Wobei davor ein Semikolon ist.


  • Mod

    Hansels schrieb:

    was hab ich falsch gemacht?

    Sehr viel:
    -Definitionen gehören nicht in Header.
    -new für statische Felder? Das ist Quatsch. (new an sich ist praktisch immer auch Quatsch)
    -Ist der Code etwa außerhalb eines Codeblocks? Soll das eine statische Initialisierung werden? So geht das nicht.
    -Globale Variablen sind ebenfalls praktisch immer Quatsch.

    Beschreib mal, was du warum erreichen möchtest. Dann kann man dir eine gute Lösung vorschlagen. Eine Verbesserung deines jetzigen Vorhabens dürfte wohl ziemlich aussichtslos sein, da es sowohl viele technische Fehler enthält, als auch an sich zweifelhaft ist.



  • Guten Morgen,
    ich will ein mehrdimensionales Feld von Rechtecken, wobei ich die Rechtecke als Elementstruktur in einer anderen Klasse definiert habe.

    ich dachte zumindest arrays mit feldgröße müssen in der header definiert werden, wenn man sie in der klasse global gebrauchen will.

    Was ist gegen globale Variablen auszusetzen?



  • Ich bau mir sozusagen eine Heatmap selbst. Neben den Zeicheneigenschaften hat dann ein Rechteck unterschiedliche Zusatzeingeschaften.
    Mittels einer selbstgemachten Heatmapklasse greife ich auf die Rechteckklasse, aus der ich dann (feldabhängig) in einem mehrdimensionalen Array eine Anzahl an Rechteckobjekten anlegen will, die unterschiedliche startkoordinaten haben und andere attribute


  • Mod

    Hansels schrieb:

    ich dachte zumindest arrays mit feldgröße müssen in der header definiert werden, wenn man sie in der klasse global gebrauchen will.

    Du definierst nie etwas im Header (außer inline/template). Wie soll das gehen? Wenn du den Header 2 Mal einbindest, hast du 2 Mal die Definition im Programm. -> ODR verletzt.

    Was ist gegen globale Variablen auszusetzen?

    😮 Wird das nicht in deinem Lehrbuch erklärt? Sie sind sowohl eine große Quelle von Fehlern, auch sind diese Fehler sehr schwer zu debuggen. Hier sind ein paar mehr Details. Im Umkehrschluss gilt, dass man den Gültigkeitsbereich von Variablen stets so klein wie möglich halten sollte. Also

    int endergebnis = 0;
    for (int i = 0; i < 10; ++i)
    {
      int zwischenergebnis = komplizierte_rechnung1(i);
      endergebnis = komplizierte_rechnung2(zwischenergebnis, i);
    }
    

    statt

    int endergebnis = 0;
    int zwischenergebnis;
    for (int i = 0; i < 10; ++i)
    {
      zwischenergebnis = komplizierte_rechnung1(i);
      endergebnis = komplizierte_rechnung2(zwischenergebnis, i);
    }
    

    oder gar

    int endergebnis = 0;
    int zwischenergebnis;
    int i;
    for (i = 0; i < 10; ++i)
    {
      zwischenergebnis = komplizierte_rechnung1(i);
      endergebnis = komplizierte_rechnung2(zwischenergebnis, i);
    }
    

    Oftmals sogar:

    Daten daten;
    {
      ifstream file("dateiname")
      file >> daten;
    }
    

    statt

    Daten daten;
    ifstream file("dateiname")
    file >> daten;
    

    Hansels schrieb:

    Ich bau mir sozusagen eine Heatmap selbst. Neben den Zeicheneigenschaften hat dann ein Rechteck unterschiedliche Zusatzeingeschaften.
    Mittels einer selbstgemachten Heatmapklasse greife ich auf die Rechteckklasse, aus der ich dann (feldabhängig) in einem mehrdimensionalen Array eine Anzahl an Rechteckobjekten anlegen will, die unterschiedliche startkoordinaten haben und andere attribute

    Ich sehe hier gar keinen Zusammenhang zu deinem Versuch. Hier kommt sogar noch ein weiteres Problem globaler Variablen hinzu, dass gar nicht erwähnt wurde, weil die Benutzung einer globalen Variable in dem Fall gar keinen Sinn hat: Du könntest nur ein einziges Objekt haben! Das ist doch sicher keine Absicht?

    Warum nicht so?

    class Rectangle { /* ... */ };
    
    class Heatmap
    {
      Rectangle rectangles[3][2];
    };
    

    oder

    class Rectangle { /* ... */ };
    
    class Heatmap
    {
      std::array<std::array<Rectangle, 2>, 3> rectangles;
    };
    

    oder

    class Rectangle { /* ... */ };
    
    class Heatmap
    {
      dynamische_2D_array_klasse_die_man_sich_schnell_und_leicht_selber_schreiben_kann<Rectangle> rectangles;
    };
    

Log in to reply