Declaration eines Array von Objekten -> cannot appear in a constant-expression
-
Hallo, ich hab ein Problem, und möchte euch um Hilfe bitten.
Intensivstes grübeln und suche in dem MSDN / Internet hatten keinen Erfolg.
(Wobei ich denke dass wenn ich mehr Erfahrung im Umgang mit dem MSDN hätte, ich vllt. eine Lösung gefunden hätte)Undzwar will ich ein Zwei-Dimensionales Array von Objekten einer eigenen Klasse auf dem Heap declarieren, wobei die Offsets von 2, vorher vom Benutzer per cin>> bestimmten, Variablen dargestellt werden.
bei 2 Dimensionen Bekomme ich die fehlermeldung:
'<NameDerVariableFürDieOffsetsDerzweitenDimension>' cannot appear in a constant-expression. (vote 4 geilster Variablen Name ever
)Wenn ich die 2. Dimension auslasse, ist alles ok.
Hier mal der code
#include <iostream> class Klasse { public: int AuslesenWert() const; void EinlesenWert(int NeuerWert); private: int Wert; }; int Klasse::AuslesenWert() const { return Wert; } void Klasse::EinlesenWert(int NeuerWert) { Wert = NeuerWert; } int main() { int IntegerEins = 0; int IntegerZwei = 0; std::cin>>IntegerEins>>IntegerZwei; Klasse * pObjekte = new Klasse[IntegerEins][IntegerZwei]; std::cin.get(); return 0; }Ich benutze code:BLOCKS und als Compiler GNU gcc
habe den Code auf der neuesten Version von CB probiert, Fehlermeldung bleibt.ich hoffe ihr könnt mir dabei helfen, ich möchte nur ungern einfach um dieses Problem 'herumsteuern', da es mich wirklich interessiert was ich da falsch mache, ausserdem früher oder später begegnet es mir doch...
bb danke im Voraus

PS: Könnte mir jemand kurz erklären wie man die Syntax Hervorhebung bei Code hinkriegt? Bei 'Vorschau' sehe ich kein farbliche Hervorhebung.
-
CPP-Tags verwendest du, indem du [cpp] vor den Code und [/cpp] danach schreibst. Alternativ kannst du den Text markieren und die erste weisse Schaltfläche mit der Aufschrift "C/C++" anklicken.
Was möchtest du hiermit erreichen? Ich nehme an, ein zweidimensionales Array. Aber das geht so nicht. Brauchst du wirklich zwei Dimensionen und möchtest dich mit manueller Speicherverwaltung rumschlagen?
Klasse * pObjekte = new Klasse[IntegerEins][IntegerZwei];Falls ja, musst du das schrittweise durchführen. Du erstellst zuerst ein dynamisches Array auf
int-Zeiger:int** Array = new int*[x];Dann initialisierst du die x Zeiger jeweils wieder mit einem dynamischen Array (in einer Schleife, hier mit Laufvariable i):
Array[i] = new int[y];Wichtig: Denk ans Freigeben, und zwar in umgekehrter Reihenfolge. Zuerst y Mal
delete[]auf die inneren Arrays, dann x maldelete[]auf die äusseren. Dazu gab es schon etliche Threads, schau doch mal in der Forensuche. Ich habe die gleiche Thematik gerade kürzlich erklärt.Alternative: Frickelei loswerden, STL-Container benutzen.
Im Magazin gibts gute Artikel über Zeiger und STL. Ich empfehle dir, diese aufmerksam durchzulesen; das dort vermittelte Wissen gehört zu den wichtigen Grundlagen in C++.
-
1. Genau das habe ich mit den Tags gemacht, aber ohne erfolg

2. Ich bin leider noch ein blutiger Anfänger, und kenne mich mit 99% was du mir erklären wolltest nicht aus ^^, darum nun meine Frage: WIESO GEANU kann man nicht einfach ein 2 Dimensionales Array machen?
Und ja es muss sein, wie gesgat ich möchte das ungerne umschiffen,
ansonsten, wenn es wirklich so schwer ist ein 2 Dimensionales Array zu amchen, lasse ich es lieber jetzt bleiben und beschäftige mich dann damit, wenn ich mich mit den Sachen die du erwähnt hast auseinander gesetzt habe.
mfG

-
under_cover schrieb:
2. Ich bin leider noch ein blutiger Anfänger, und kenne mich mit 99% was du mir erklären wolltest nicht aus ^^, darum nun meine Frage: WIESO GEANU kann man nicht einfach ein 2 Dimensionales Array machen?
Man kann. Wenns dir um einfache Benutzung und Anwendung geht, sind
std::vectorund Co. erste Wahl. Mehr dazu findest du in meinem verlinkten Artikel.Natürlich sind Zeiger und dynamische Speicherverwaltung - wie bereits erwähnt - ein sehr wichtiger Bestandteil von C++, den du so oder so lernen musst. Du kannst auch jetzt die Fertiglösungen anschauen und die Details später lernen, aber darum herum kommst du eh nicht, wenn du C++ ernsthaft lernen willst.
Deine Entscheidung, ob du lieber gleich komfortabel und effizient programmierst und Details verschiebst, oder ob du dir zuerst Implementierungsmöglichkeiten zu Gemüte führst und dich dann nachher umso mehr freust, etwas Abstraktes anwenden zu können, das du auch verstehst.

-
Ich komme wohl nicht drumrum, muss erstmal etwas Zeit investieren um mir das an zu eignen. Ich es nicht aushalten Sachen zu verwenden die ich nicht verstehe

Schade, und ich dachte schon ich könnte mal eben ein VierGewinnt Spiel schreiben
Danke dir, ich schau mir die 2 Artikel an, und sobald ich mit meinem Buch fertig bin (aber bestimmt auch zwishcendurch) weiter das Magazin an.
bb und Danke nochmals

-
under_cover schrieb:
Schade, und ich dachte schon ich könnte mal eben ein VierGewinnt Spiel schreiben

Dafür ist C++ definitiv die falsche Sprache.

Wenn du die Grundlagen dafür einmal beherrschst, hast du auch nahezu unendlich viele Möglichkeiten.under_cover schrieb:
Ich es nicht aushalten Sachen zu verwenden die ich nicht verstehe

Hmm. Irgendwoher kenne ich das...

Naja, mit der zunehmenden Komplexität von benutztem Code lernt man, sich damit abzufinden.
-
Komisch, mein Vier-Gewinnt-Spiel benutzt keinen std::vector für das Spielfeld, weil das wäre ja auch Quatsch.
-
volkard schrieb:
Komisch, mein Vier-Gewinnt-Spiel benutzt keinen std::vector für das Spielfeld, weil das wäre ja auch Quatsch.
Wie du vielleicht mitbekommen hast, geht es in diesem Thread nicht primär um das Vier-Gewinnt. Ich habe under_cover zwei Wege vorgeschlagen, wie er sich die notwendigen Techniken aneignen kann, um seine Ziele zu erreichen.
-
Ich füge mal noch eine "Technik" hinzu.
@under_cover
Du kannst die Arithmetik statt gemütlich über den ArrayIndex auch manuell durchführen.// statisch Klasse aKlasse[IntegerEins][IntegerZwei]; aKlasse[x][y] = Klasse(); // mit x=0..InterEins-1 und y=0..InterZwei-1 aKlasse[x][y].EinlesenWert(99) ; // dynamisch Klasse *pKlasse = new Klasse[IntegerEins * IntegerZwei]; *(pKlasse + x * IntegerZwei + y) = Klasse(); // ebenfalls mit x=0..InterEins-1 und y=0..InterZwei-1 (*(pKlasse + x * IntegerZwei + y)).EinlesenWert(88); //oder (pKlasse + x * IntegerZwei + y)->EinlesenWert(99);Vielleicht kann auch irgendwo ein Klammerpaar weggelassen werden. Ich hoffe nur das Prinzip wird klar.
Den Index-Ausdruck
array[a][b]
wandelst du für dein dynamisches Datenfeld in seine Entsprechung um
*(array + a * GroesseDesZweitenIndexes + b)Den Zeiger mit simpler Arithmetik auf das entsprechende Feld zeigen lassen und dann einmal mit ***** dereferenzieren oder den -> Operator verwenden. Das ist schon alles.
Wenn du noch eine Klasse Spielfeld erstellst, hinter der du den Kram verbergen kannst (ist ja wahrscheinlich nur Wert setzten, Wert auslesen) sieht dein Quelltext auch aufgeräumt aus und du könntest auch die Arraygrenzen prüfen.