scanner funtzt nicht



  • Personen p =new Personen();
    

    ersetzen durch

    Personen p;
    

    Wie Du jetzt auf Person::p kommst weiß ich nicht.

    Schau Dir das Thema Zeiger noch mal an, im geposteten Source hast Du leaks, müsstest bei push_back den Zeiger dereferenzieren (geht einfacher durch Personen p, kein Zeiger, keine Leaks).

    Includeguards gehören in den eigentlichen Header, nicht an die Stelle in der die Datei includiert wird.



  • wird durch Personen p überhaupt ein neues Objekt erzeugt? dazu brauch man doch das new oder? also nur Peronen p fällt aus weil ich bei zeile 66 immer eine neue person erzeuge, und was ich jetzt nicht verstehe ist folgendes:

    Personen *p= new Personen();
    //...
      p= new Personen(); //funzt
    // *p= new Personen(); funzt nicht
    

    p ist doch ein zeiger warum beim zuweisen eines neuen Objekts kein * ?



  • Also durch Personen P; wird sehr wohl ein neues Objekt erzeugt. Nur halt auf dem Stack und nicht auf dem Heap.

    Viele Tutorials und Bücher hämmern einem leider immer zuerst und ausführlich das new ein. In 99% der Fällt kommt man ohne new aus. Frage: wie erzeugst du ein neues int?

    So:

    int i;
    

    oder so:

    int *i = new int;
    

    In 99% der Fälle doch eher wie im ersten Fall, oder? 😃 Personen und jede andere Klasse, ist in C++ ein Typ. Genauso wie int, char usw. auch Typen sind.
    Jetzt vergleich mal die erste Variante mit der:

    Personen i;
    

    Hem... sieht gleich aus. Nur ein anderer Typ. 😮



  • Neue Elemente in den Vector packen - ohne new

    std::vector<T> vec;
    
    for(int i = 0;i < 10;++i)
    {
        T t;  *1
        t.member1 = 12;
        t.memfunc(iregndwas);
    
        vec.push_back(t); *2
    }
    

    *1
    Durch die { } wird t am Ende eines durchlaufes der Schleife stehts zerstört, Du legst also immer ein neues Objekt an.
    *2 Von diesem Objekt wird eine Kopie erzeugt.

    Nur 1 Objekt anlegen und immer wieder verwenden *1

    std::vector<T> vec;
    
    T t;  *2
    for(int i = 0;i < 10;++i)
    {
        t.member1 = 12;
        t.memfunc(iregndwas);
    
        vec.push_back(t); *3
    }
    

    *1 Das Objekt wird nur einmal angelegt und behält immer die letzen Werte.
    So kann man z.B., wenn man nur 2 von 8 Werten ändern muss, vorbelegen
    *2 Alle oder die nur gewünschten Werte ändern
    *3 push_back erzeugt eine Kopie des Objektes, somit kann man das alte Objekt
    wieder modifizieren.

    Zeiger:

    T * t;  << // Das * sagt, das wir nun einen Zeiger auf den Typ t haben.
    
    t = new T; // t wurde weiter oben als T * (also Zeiger auf t) deklariert. 
               // t ist ein Zeiger und wird auch immer ein Zeiger sein
    
    *t = <...> // Der * vor einem Zeiger dereferenziert. Man kommt also an
               // den "inhalt" des Zeigers herann.
    


  • Mit "p=..." änderst du das Ziel, auf das der Zeiger verweist (könnte ein Speicherleck geben, wenn niemand anderes auf das alte Ziel zeigt), mit "*p=..." änderst du den Inhalt der Variable, auf die du zeigst.

    Und "Personen p;" legt ein neues Objekt an, das von späteren Methodenaufrufen immer wieder aktualisiert wird. (push_back() speichert eine Kopie davon, so daß du es danach neu verwenden kannst)



  • jetzt tauchen nur noch die fehlermeldungen bei zeile 80 und 82 auf.
    einen destruktor hab ich definiert, aber was will der kompiler da innerhalb der methode nachdem Personen p; eh auf dem stak liegt müsste es doch passen oder?



  • meth schrieb:

    jetzt tauchen nur noch die fehlermeldungen bei zeile 80 und 82 auf.

    Was für Fehler?

    einen destruktor hab ich definiert, aber was will der kompiler da innerhalb der methode nachdem Personen p; eh auf dem stak liegt müsste es doch passen oder?

    Wo (in welchem Bereich der Klassendefinition) und wie hast du den Dtor angelegt?

    PS: Auch Stack-Variablen müssen sauber gelöscht werden, benötigen also Zugriff auf ihren Dtor.



  • ich hab oben nach using namespace std den destruktor:

    Scanner::~Scanner(){
    }
    

    delete p funtz nicht weil p ja keine klassenvariable ist.



  • was simmt bei der anweisung nicht? gibts irgendwo ein anständiges destuktortutorial was mehr als nur

    ~bla(){}
    

    zu bieten hat?



  • mit dem destruktor war alles in ordnung eine } zuviel in der methode war schuld.
    jetzt läuft das programm liefert abew einen leeren vector zurück warum 😕


Anmelden zum Antworten