Array vom Typ Klasse?



  • 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? ...?



  • Zunächst ein Denkfehler 😞

    Ich bekomme jetzt den Vektor wie folgt angelegt:

    std::vector<mobject> mobjects(); // Wenn ich in den '()' eine Zahl herein schreibe, erscheint die Meldung: unexpectet token `('
    

    Lass ich die Klammer leer und versuche nun in der .cpp Datei darauf zuzugreifen, bekomme ich die Meldung: '((phy*)this)->phy::mobjects' does not have class type

    😕



  • Das ist eine Funktionsdeklaration. Mach die Klammern weg.



  • Und was sollen die Klammern da, machst du das bei anderen Variablen auch?



  • Nathan schrieb:

    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

    Schreibe ich es ohne die (),

    std::vector<mobject> mobjects;
    

    Bekomme ich folgende Meldung raus:
    error: 'mobject' was not declared in this scope
    error: template argument 1 is invalid
    error: template argument 2 is invalid

    Durch die Meldung "'mobject' was not declared in this scope"
    Habe ich folgendes gemacht:

    mobject mOBJECT;
        std::vector<mOBJECT> mobjects;
    

    Und bekomme diese Meldungen:

    ../phy.h:75:13: error: invalid use of non-static data member 'phy::mOBJECT'
    ../phy.h:76:17: error: from this location
    ../phy.h:75:13: error: invalid use of non-static data member 'phy::mOBJECT'
    ../phy.h:76:17: error: from this location
    ../phy.h:76:17: error: 'phy::mOBJECT' cannot appear in a constant-expression
    ../phy.h:76:24: error: template argument 1 is invalid
    ../phy.h:76:24: error: template argument 2 is invalid

    😮 😕



  • Du hast den Header nicht inkludiert, der mobject definiert.



  • Doch, habe ich



  • Ok, beide Header verwenden die selben include guards.



  • Supercomputer schrieb:

    mobject mOBJECT;
        std::vector<mOBJECT> mobjects;
    

    Und bekomme diese Meldungen:

    ../phy.h:75:13: error: invalid use of non-static data member 'phy::mOBJECT'
    ..😮 😕

    std::vector<mobject> mobjects;
    

    In die spitzen Klammern kommt der Typ.



  • Caligulaminus schrieb:

    Supercomputer schrieb:

    mobject mOBJECT;
        std::vector<mOBJECT> mobjects;
    

    Und bekomme diese Meldungen:

    ../phy.h:75:13: error: invalid use of non-static data member 'phy::mOBJECT'
    ..😮 😕

    std::vector<mobject> mobjects;
    

    In die spitzen Klammern kommt der Typ.

    Warum funktioniert es dann bei der hervorgehenden Schreibweise nicht?

    #inlcude mobject.h // Enthält die Klasse mobject
    

    So includiert ist?



  • #include "mobject.h"
    


  • Sorry, vertippt.

    Im original Code steht es richtig.

    Qt meckert nämlich sofort, wenn was nicht stimmt.

    Fehler gefunden 🙂

    Hatte in der mobject.h

    auch einen #include von phy.h drinn.

    Diesen entfernt und es funktioniert

    Danke an alle für die Hilfe



  • Eine Frage bleibt mir da noch, wie komme ich an die Werte wieder dran?

    Wenn ich z.B. die Position auf der X-Achse wissen möchte, nutze ich die Methode

    long double getpositionx();
    


  • vector<int> vec({1, 2, 3});
    assert(vec[0] == 1);
    assert(vec[1] == 2);
    assert(vec[2] == 3);
    


  • Ethon schrieb:

    vector<int> vec({1, 2, 3});
    assert(vec[0] == 1);
    assert(vec[1] == 2);
    assert(vec[2] == 3);
    

    Den Code verstehe ich gerade leider nicht 😞

    Werde da gerade 3 Variablen deklariert, die dann mit dem Index "[]" abgerufen werden?


Anmelden zum Antworten