Array vom Typ Klasse?
-
Hallo,
ich bin neu in diesem Forum, hoffe aber am richtigem Ort für mein Anliegen zu sein.
Aktuell arbeite ich an einer Physikengine, um es einfacher zu machen, arbeite ich mit 4 eigenen Klassen:
Klasse "phy": hier fließt alles zusammen
Klasse "mobject" für Objekte die sich bewegen sollen.
Klasse "sobject" für Objekte die sich nicht bewegen.
Klasse "base" für einige Basics die ich so nur einmal schreiben muss.Nun zu meinem Problem.
Ich würde gerne ein Array in dem phy Header anlegen, uns war vom Typ mobject (wenn das funktioniert auch von sobject).
Im Code sieht das dann so aus.private: mobject mobjects[]; };Die mobject.h ist includiert. Jedoch bekomme ich folgenden Fehler: error: 'mobject' does not name a type
Das Framework welches ich nutze ist Qt.
Gibt es eine Möglcihkeit einen Array vom Typ einer Klasse zu deklarieren, oder ist das nicht möglich?
Ich komme so leider nicht weiter und bin über jeder Hilfe dankbar.Mit freundlichen Grüßen
Supercomputer
-
Warum nimmst du keine STL-Container, also
std::vector<mobject>? Ist ohnehin sinnvoller als rohe Arrays.
-
Supercomputer schrieb:
Die mobject.h ist includiert. Jedoch bekomme ich folgenden Fehler: error: 'mobject' does not name a type
Das hat doch nichts damit zu tun, dass du ein Array deklarieren willst. Die Klassendefinition ist einfach nicht bekannt, z.B. weil du das #include vergessen hast. Außerdem haben Arrays eine Größe. Ansonsten was Nexus gesagt hat.
-
Der Fehler liegt wohl nicht bei dem Code, den du gepostet hast. Der Compiler kennt den Typ einfach nicht. Das kann einige Ursachen haben.
Übrigens musst du, wenn du ein Array mit "typ identifier[] ;" deklarierst, zur Laufzeit noch Speicher allozieren mit "identifier = new typ[ dim ] ;" und nicht vergessen, den Speicher wieder freizugeben mit "delete[] identifier ;", wenn du ihn nicht mehr brauchst.
-
Thilo87 schrieb:
Übrigens musst du, wenn du ein Array mit "typ identifier[] ;" deklarierst, zur Laufzeit noch Speicher allozieren mit "identifier = new typ[ dim ] ;" und nicht vergessen, den Speicher wieder freizugeben mit "delete[] identifier ;", wenn du ihn nicht mehr brauchst.
Nein. Arrays und Zeiger sind komplett verschiedene Dinge. Das Resultat von
new[]wird Zeigern zugewiesen, nicht Arrays.Davon abgesehen ist manuelle Speicherverwaltung keine so gute Idee. Nimm STL-Container, wie schon erwähnt.
-
Nexus schrieb:
Warum nimmst du keine STL-Container, also
std::vector<mobject>? Ist ohnehin sinnvoller als rohe Arrays.Wie geht das? Da ich die alle Deklarationen gerne in den Headern haben möchte.
Mit Methoden der Klasse wird der Array erweitert, verkleinert und gelöscht. So dass es kein "Memory leak" gibt

Mit freundlichen Grüßen
Supercomputer
-
Supercomputer schrieb:
Wie geht das? Da ich die alle Deklarationen gerne in den Headern haben möchte.
Schau am besten in deinem C++-Buch nach, was die STL genau ist. Zur Not gehen auch Online-Tutorials, aber langfristig kommst du bei C++ nicht um ein Buch herum.
Supercomputer schrieb:
Mit Methoden der Klasse wird der Array erweitert, verkleinert und gelöscht. So dass es kein "Memory leak" gibt

Genau das machen STL-Container für dich. Kein Grund, das Rad neu zu erfinden.
-
Mir wurde in einem anderen Forum gesagt, dass Vektoren langsamer als Arrays sein, stimmt das?
Da es bei einer Physikengine bei einer zunehmenden Anzahl an Objekten immer noch schnelle Berechnungen geben sollte.
In ca. 2 Monaten würde ich es in der Schule lernen, da aber bald die Sommerferien beginnen, wird kaum noch was gemacht.
Könnt ihr mir ein gutes Tutorial oder ähnliches empfehlen? Gerne auch in Englisch.
Da ich bisher noch nicht mit Vektoren gearbeitet habe.Mit freundlichen Grüßen
Supercomputer
-
std::vector ist langsamer als rohe C-Arrays, ja.
Aber std::vector ist mit hoher Wahrscheinlichkeit schneller als deine dynamische Array Variante.
Wenn man dynamische Arrays braucht, nimmt man std::vector. Der ist auf gar keinen Fall langsamer, wenn sogar schneller, einfacher zu nutzen und sicherer (ich wette, dein Code ist nicht exception safe).
-
Supercomputer schrieb:
Mir wurde in einem anderen Forum gesagt, dass Vektoren langsamer als Arrays sein, stimmt das?
Und Birnen machen satter als Äpfel. Ist alles eine Frages des Kontexts.
std::vector ist langsamer als rohe C-Arrays, ja.
Das Erzeugen & Zerstören. Der Zugriff nicht.
-
Nathan schrieb:
std::vector ist langsamer als rohe C-Arrays, ja.
Waas?
Wo std::vector die relevanten Operationen (nämlich den Zugriff per Index) kapselt, soll das langsamer sein?
Wenn std::vector::at langsamer ist kann ich das verstehen, durch die Range-Prüfung, aber std::vector::operator[]????
Vorrausgesetzt, der Optimizer ist angeschaltet.
-
Skym0sh0 schrieb:
Nathan schrieb:
std::vector ist langsamer als rohe C-Arrays, ja.
Waas?
Wo std::vector die relevanten Operationen (nämlich den Zugriff per Index) kapselt, soll das langsamer sein?
Wenn std::vector::at langsamer ist kann ich das verstehen, durch die Range-Prüfung, aber std::vector::operator[]????
Vorrausgesetzt, der Optimizer ist angeschaltet.->
Ethon schrieb:
std::vector ist langsamer als rohe C-Arrays, ja.
Das Erzeugen & Zerstören. Der Zugriff nicht.
-
Nexus schrieb:
Thilo87 schrieb:
Übrigens musst du, wenn du ein Array mit "typ identifier[] ;" deklarierst, zur Laufzeit noch Speicher allozieren mit "identifier = new typ[ dim ] ;" und nicht vergessen, den Speicher wieder freizugeben mit "delete[] identifier ;", wenn du ihn nicht mehr brauchst.
Nein. Arrays und Zeiger sind komplett verschiedene Dinge. Das Resultat von
new[]wird Zeigern zugewiesen, nicht Arrays.Fast vollständig "doch". Nur dass man "typ identifier[] ;" kein Array nennt, sondern einen Zeiger. Ein dynamisches Array wird aus dem Speicher, wo der Zeiger *identifier hinzeigt, wenn man es alloziert.
Damit sind 2 Aussagen von mir richtig, und eine Bezeichnung falsch. Die Antwort "Nein." passt da nicht. Besser wäre es gewesen, wenn du auf meine falsche Bezeichnung hingewiesen hättest, dann wäre deine Antwort auch konstruktiv etwas wert gewesen.
-
Supercomputer schrieb:
Mir wurde in einem anderen Forum gesagt, dass Vektoren langsamer als Arrays sein, stimmt das?
Da es bei einer Physikengine bei einer zunehmenden Anzahl an Objekten immer noch schnelle Berechnungen geben sollte.
Das Problem an solchen Mythen ist, dass man Bruchstücke davon mitbekommt, und dann ohne die Hintergründe zu verstehen irgendwelche total fragwürdigen Entscheidungen trifft. Wie du z.B. Arrays statt den sinnvolleren STL-Containern einsetzen willst, obwohl sie kein bisschen für deinen Einsatzzweck geeignet sind, nur weil du mal was gehört hast.
Wenn du eine Physikengine schreibst, dann befasse dich bitte ernsthaft mit den zugrunde liegenden Mechanismen. Kenntnisse der STL und Datenstrukturen im Allgemeinen ist absolut unumgänglich bei einem solchen Unterfangen.
Thilo87 schrieb:
Nur dass man "typ identifier[] ;" kein Array nennt, sondern einen Zeiger.
Falsch. Einzig und allein in Parameterlisten trifft das zu, aber definitiv nicht als Member.
Thilo87 schrieb:
Ein dynamisches Array wird aus dem Speicher, wo der Zeiger *identifier hinzeigt, wenn man es alloziert.
Es ging aber um statische Arrays. Geht es eigentlich immer, wenn man nichts dazu sagt, der Begriff "Array" ist genügend klar im Standard definiert.
Thilo87 schrieb:
Damit sind 2 Aussagen von mir richtig gewesen
Nein, sorry. Die Aussage zur manuellen Speicherverwaltung mag zwar stimmen, ging aber am Thema vorbei.
-
Thilo87 schrieb:
Nexus schrieb:
Thilo87 schrieb:
Übrigens musst du, wenn du ein Array mit "typ identifier[] ;" deklarierst, zur Laufzeit noch Speicher allozieren mit "identifier = new typ[ dim ] ;" und nicht vergessen, den Speicher wieder freizugeben mit "delete[] identifier ;", wenn du ihn nicht mehr brauchst.
Nein. Arrays und Zeiger sind komplett verschiedene Dinge. Das Resultat von
new[]wird Zeigern zugewiesen, nicht Arrays.Fast vollständig "doch".
Fast vollständig nicht.
Die einzige Gemeinsamkeit ist operator[].Nur dass man "typ identifier[] ;" kein Array nennt, sondern einen Zeiger.
typ identifier[]nennt man auch nicht Zeiger, das nennt man illegal.§3.9/5 schrieb:
A class that has been declared but not defined, or an array of unknown size or of incomplete element type, is an incompletely-defined object type.
Incompletely-defined object types and the void types are incomplete types (3.9.1). Objects shall not be defined to have an incomplete type.
-
Dann ist die Frage geklärt.
Ich wollte jetzt keine Diskussion oder gar einen Streit auslösen.Verstehe ich das richtig, dass Vektoren immer dynamisch sind?
Und was gibt es da besonders zu beachten (Initialisierung, Zugriff usw.)?
Mit freundlichen Grüßen
Supercomputer
-
Supercomputer schrieb:
Verstehe ich das richtig, dass Vektoren immer dynamisch sind?
Ja.
Und was gibt es da besonders zu beachten (Initialisierung, Zugriff usw.)?

Nichts, das ist ja das tolle.
Du musst lediglich beim Zugriff im definierten Bereich bleiben, wie sonst auch, aber ansonsten erledigt der alles für dich.
Beispiel:// Erstelle ein vector von 5 ints, die mit 0 initialisiert werden. std::vector<int> vec(5); // Setze das dritte Element auf 1 vec[2] = 1; // Füge eine Element hinten an (sehr effizient) vec.push_back(3); // Lösche die ersten beiden Elemente (ineffizient) vec.erase(vec.begin(), vec.begin() + 2); // Füge vorne eine Element an (ineffizient) vec.insert(vec.begin(), 1); // Ändere seine Größe auf 2 vec.resize(2);Für weitere Funktionen, siehe hier: http://en.cppreference.com/w/cpp/container/vector
-
Nathan schrieb:
// Erstelle ein vector von 5 ints, die mit 0 initialisiert werden. std::vector<int> vec(5); // Setze das dritte Element auf 1 vec[2] = 1; // Füge eine Element hinten an (sehr effizient) vec.push_back(3); // Lösche die ersten beiden Elemente (ineffizient) vec.erase(vec.begin(), vec.begin() + 2); // Füge vorne eine Element an (ineffizient) vec.insert(vec.begin(), 1); // Ändere seine Größe auf 2 vec.resize(2);Für weitere Funktionen, siehe hier: http://en.cppreference.com/w/cpp/container/vector
Das mit der Effizienz kannst du dir auch ganz gut merken, Anweisungen, die "aufwendiger" zu schreiben sind (wie etwas Geschichte mit begin() und sonstwas), sind Pi*Daumen ineffizient. Das stimmt natürlich nicht immer. Aber wenn du die STL mal etwas besser kennst und auch die Konzepte dahinter (z.B. Iteratoren) dann kannst du das ganz gut abschätzen.
-
Danke für die Hilfe, Vektoren scheinen perfekt geeignet zu sein.
Jedoch schaffe ich es nicht, einen Vektor vom Typ einer eigenen Klasse wie mobject an zu legen.
Obwohl Dinge wie:
mobject test; test.methode();Funktionieren

-
Es wird dir nicht viel bringen, wenn wir dir die Syntax für ein ganz spezifisches Problem zeigen, solange du die Grundlagen dazu nicht verstehst.
Wie gesagt:
Wenn du eine Physikengine schreibst, dann befasse dich bitte ernsthaft mit den zugrunde liegenden Mechanismen. Kenntnisse der STL und Datenstrukturen im Allgemeinen ist absolut unumgänglich bei einem solchen Unterfangen.
Also nimm dir ein gutes Buch und fange an, du brauchst auch viel weniger Zeit als wenn du hier alles nachfragst

-
Was heißt "schaffst du nicht"?
Fehlermeldung? Auf einmal nicht in der Lage die Tastatur zu nutzen, so sehr du es auch versuchst (dann solltest du vielleicht zu einem Psychologieforum wechseln)? Der Rechner geht immer aus? ...?