Problem mit Pointer-Arrays



  • Hallo liebes Forum,
    ich bräuchte einmal Hilfe bei dem folgenden Beispiel Code (guter, alter Segmentation Fault). Er stellt eine einfachere Version meines Problemes dar 😉

    class sObj {
    public:
        int i = 0;
    
        sObj() {
            cout << this->i << endl;
        }
    
        sObj(int i) {
            this->i = i;
            cout << this->i << endl;
        }
    };
    
    class aObj {
    public:
        const int length;
        sObj* array;
    
        aObj(const int _length) : length(_length) {
            sObj * array[length];
        }
    
        void add(sObj *newObj) {
            for (int i = 0; i < this->length; i++) {
                if (&this->array[i] == NULL) {
                    this->array[i] = *newObj;
                    this->array[i].i = i;
                    break;
                }
            }
        }
    
        void remove(sObj *oldObj) {
            for (int i = 0; i < this->length; i++) {
                if (this->array[i].i == oldObj->i) {
                    this->array[i] = NULL;
                    break;
                }
            }
        }
    };
    
    int main(int argc, char** argv) {
        aObj *test = new aObj(3);
        sObj *neO = new sObj();
        test->add(neO);
        return 0;
    }
    

    Ziel ist es ein Array zu haben, in welchem die Objecte direkt abgespeichert werden sollen. Dabei soll die Struktur etwa so aussehen:
    Pointer->Array[0]=sObj
    Oder so halt:
    PointerA->String[0]
    PointerA->String[1]
    etc...

    Es kann gut sein, dass ich ein Grundlegendes Problem mit Array habe bzw. inzwischen einen blöden Denkfehler habe...
    Danke,
    Simonmicro



  • @simonmicro sagte in Problem mit Pointer-Arrays:

    aObj(const int _length) : length(_length) {
            sObj * array[length];
     }
    

    Und das macht jetzt was?

    Benutze std::vector!



  • @manni66 Es soll das Array vorbereiten mit der gegebenen festen Länge (die const int length wird als Konstante von _length erstellt.). Ich meine dies funktioniert auch, mein Debugger zeigt mir z.Z. nicht die notw. Informationen.
    Eigentlich wollte ich std::vector (ich habe ja eine feste Länge....) vermeiden, da ich diese noch nie genutzt hatte - schließlich kann man ja auch Array so erstellen... Oder?



  • @simonmicro sagte in Problem mit Pointer-Arrays:

    schließlich kann man ja auch Array so erstellen... Oder?

    Ja, kann man - eines, das existiert, bis der Konstruktor beendet wird. Dein array im Konstruktor ist nicht this->array. Schalte die Warnungen deines Compilers eine.

    @simonmicro sagte in Problem mit Pointer-Arrays:

    wollte ich std::vector vermeiden, da ich diese noch nie genutzt hatte

    Dumme Idee, insbseondere da du offensichtlich auch mit dem Array keine Erfahrung hast.



  • @simonmicro sagte in Problem mit Pointer-Arrays:

    Eigentlich wollte ich std::vector (ich habe ja eine feste Länge....) vermeiden

    Dann nimm std::array!



  • @manni66 @theta
    Ohje, ich bin so blöd gewesen diese beiden Klassen zu ignorieren! Zwei YT-Videos später und ich werde wahrscheinlich weniger oft C(++) Arrays verwenden. Z.B. es ist echt schrecklich immer die Größe zu übergeben oder die eigene Klasse einer abstrakten Datenstruktur zu suchen und einzubinden. Danke! 👍
    Ich schicke gleich mal den neuen Code (nur für den, den es interessiert). Ebenso hier ein die beiden Videos zum Einstieg:
    https://www.youtube.com/watch?v=Hw42GkHPyvk&index=28&t=505s&list=PLBTSut-fdR4Zb2w2Unzq36EV-NauiCUKf
    https://www.youtube.com/watch?v=PocJ5jXv8No&index=29&t=0s&list=PLBTSut-fdR4Zb2w2Unzq36EV-NauiCUKf

    #include <cstdlib>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class sObj {
    public:
        int id = 0;
        sObj(int id) {
            this->id = id;
            cout << this->id << endl;
        }
    };
    
    class aObj {
    public:
        vector<sObj> Aarray;
    
        aObj() {
            //Nothing
        }
    
        void add(sObj *newObj) {
            this->Aarray.push_back(*newObj);
        }
    
        void remove(sObj *oldObj) {
            for (int i = 0; i < this->Aarray.size(); i++) {
                if (this->Aarray.at(i).id == oldObj->id) {
                    this->Aarray.erase(Aarray.begin() + i);
                    break;
                }
            }
        }
    };
    
    int main(int argc, char** argv) {
        aObj *test = new aObj();
        sObj *neO = new sObj(1);
        sObj *ne1 = new sObj(2);
        test->add(neO);
        test->add(ne1);
        return 0;
    }
    


  • @simonmicro sagte in Problem mit Pointer-Arrays:

    this->Aarray.push_back(*newObj);

    Du weißt, dass du eine Kopie einfügst?



  • @manni66
    In dem Falle schon 😃 Im eigentlichen Programm ist der std::vector eine Pointersammlung geworden.
    Sry nochmals für meine Blödheit 😉
    Simonmicro


  • Mod

    So wie auch bei Arrays gilt bezüglich new: Finger weg! Das gilt sogar noch stärker als bei rohen Arrays. Arrays haben ihre Anwendungsfälle, aber new darf nie im Code auftauchen, außer du schreibst einen eigenen Speichermanager oder ähnliches. In C++ macht man dynamische Speicherverwaltung anders, besser, und einfacher. In diesem Fall ist es sogar trivial umzuschreiben, da du gar keine dynamische Speicherverwaltung brauchst: Lass es einfach komplett weg!

    Gleiches gilt für Pointer. Als Anfänger hast du sie garantiert falsch benutzt, und du hast dir auch hier nicht das Wissen angeeignet, wie man es in C++ eigentlich richtig macht. Auch in diesem Fall ist es in deinem Programm trivial umzuschreiben, ohne etwas neues zu lernen, da du die Pointer einfach völlig unnötig benutzt. Also weglassen, oder durch Referenzen ersetzen.



  • Und am besten guckst du dir auch noch ein Mal das erase-remove Idiom an.