Multidimensionales Array aus Objekten?
-
Hallöchen,
dass man ein Objekt auch per Array vervielfältigen kann, hab ich hier irgendwo per Suchfunktion herausgefunden. Mein Problem ist, dass scheinbar mehrdimensionale Arrays nicht angenommen werden.
Beispiel:
kreis *testkreis = new kreis[10]; <---Funktioniert
kreis *testkreis = new kreis[10][10]; <---Funktioniert nicht!
Gibt es dafür einen Lösungsweg wie man dennoch mehrdimensionale Arrays machen kann, vielleicht ist es ja nur ein Syntaxfehler?
mfg.
Ynnus
-
FAQ
-
Wow, hier wird man ja nett empfangen...
Soll ich davon ausgehen, dass es jedes Thema im FAQ erklärt gibt? Wie gesagt, ich hab ja die Suchfunktion angeschmissen, nur da hab ich nichts gefunden.
-
ich glaub das ging irgendwie so:
kreis **testkreis=new Kreis[10]; for(int i;i<10;i++) *kreis[i]=new Kreis[10];
aber wahrscheinlich sind die pointer durcheinander ^^
auf jeden fall muss man es über eine for-schleife machen, es sei denn du nimmst lieber einen std::vector :#include <vector> std::vector<std::vector<*kreis>> testkreis;
greetz,
chris
-
Ynnus schrieb:
Wow, hier wird man ja nett empfangen...
Soll ich davon ausgehen, dass es jedes Thema im FAQ erklärt gibt? Wie gesagt, ich hab ja die Suchfunktion angeschmissen, nur da hab ich nichts gefunden.Na ja, also ich bin ja auch etwas neuer hier, aber ein Blick in die FAQ kann man auch von Neulingen und Noobs erwarten. Zumindest nach Aufforderung sollte man das Schaffen. Also nicht aufregen, einfach mal schauen
(link ist oben rechts auf deinem Bildschirm). Wenns dann immer noch nicht klar ist, kann man ja nochmal fragen.
-
chris90 schrieb:
es sei denn du nimmst lieber einen std::vector :
#include <vector> std::vector<std::vector<*kreis>> testkreis;
sollte es in diesem fall nicht besser so aussehen:
#include <vector> std::vector<std::vector<Kreis>> testkreis;
es sollen ja keine zeiger darin gespeichert werden...
und auch deine erste variante kommt mir etwas komisch vor...
ich würde das eher so machen:Kreis **testkreis=new Kreis*[10]; for(int i=0;i<10;i++) testkreis[i]=new Kreis[10];
dein code dürfte erstens nicht kompilierbar sein und wenn, dann würde er womöglich auch gleich noch abstürzen
-
Ynnus schrieb:
Gibt es dafür einen Lösungsweg wie man dennoch mehrdimensionale Arrays machen kann, vielleicht ist es ja nur ein Syntaxfehler?
Nun, mehrdimensionale Arrays gibts in C++ eigentlich nicht. kreis[10][10] ist letztendlich auch nur ein simples Array, mit der Besonderheit, dass jedes Element vom Typ kreis[10] ist, und damit auch wieder ein Array. Eine wirklich schöne Standard Lösung gibts dafür nicht. Auch das beliebte vector<vector<T> > ist letztendlich nicht mehr als chris90's Beispiel gekapselt (mal abgesehen von den Fehlern). Nur toll ist das nicht, erst recht bei grossen Dimensionen. Wozu (bezogen auf dein Beispiel) soll man 11 mal Speicher reservieren, wenn es auch mit einem mal getan ist? Wobei diese Art des Handlings für gewisse Anforderungen durchaus Vorteile haben kann.
In boost gibts zwar Sachen für solche mehrdimensionalen Geschichten, allerdings weiss ich nicht, inwiefern boost schon das Richtige für dich ist.
Bis dahin kannst du trotzdem erstmal auf die vector Variante zurückgreifen.
-
ich hatte mir irgendwann mal ne klasse für sowas gebastelt. besser ist natürlich boost::multi_array.
kann selbstverständlich nach belieben erweitert werden
der vorteil gegnüber chris90 methode (klappt nämlich einwandfrei; habs selber mal so gemacht @ Der Meister :p ) ist ganz klar, dass der overhead wegen der vielen pointer wegfällt...template <typename T> class matrix { public: typedef T value_type; // ... matrix(size_type width, size_type height): m_width(width), m_height(height), m_data(new T[size()]) {} // ... matrix<T>& operator = (matrix<T> m) { swap(m); return *this; } pointer operator [] (size_type y) // evtl. proxy objekt zur bereichsüberprüfung für breite zurückgeben { assert(y < m_height); return m_data + (y * m_width); } size_type width() const {return m_width;} size_type height() const {return m_height;} size_type size() const {return width() * height();} // ... private: size_type m_width; size_type m_height; pointer m_data; };