Klassenvektor in main() ausgeben



  • @JTR666 sagte in Klassenvektor in main() ausgeben:

    Was ist denn daran so abwegig?

    Wozu soll das gut sein?



  • @manni66 Meinst du, dass ich auch einfach dass in der main() hätte schreiben können? 😃
    Ja das hätte ich natürlich, aber ich wollte mir mal Zeiger und Referenzen von und auf Klassen aneignen, und dann ist mir das als Übung in den Sinn gekommen^^



  • naja, es gibt keinen Grund, einen Zeiger auf einen Vector zu benutzen; nimm stattdessen einen Vector.
    Hier bringt Dir der Zeiger nur Nachteile, Du musst Dich darum kümmern beim Kopieren, beim Zuweisen, beim Zerstören des prime-Objektes ... und all das tust Du zur Zeit nicht, in einem größeren Programm, wo Du vielleicht mehrere Instanzen Deiner Klasse anlegen würdest, würde Dir das ganz schnell um die Ohren fliegen.



  • @Belli Achso das^^
    Nee ich hab das gemacht, weil ich das Dingen auf den Heap packen wollte, weil bei jedem Zahlen input die Anzahl der Elemente im Vektor anders ist. Ergo, der Vektor hat immereine Variable Größe.^^



  • @JTR666
    Der Vector vergrößert sich selbstständig bei Bedarf.
    Glaub mir, der Zeiger auf den Vector ist hier kontraproduktiv.
    Die Elemente des Vectors liegen sowieso auf dem Heap!

    Edit:
    Von Deiner Logik wollen wir erst mal nicht sprechen:

    Zu testende Zahl: 2
    2 ist keine Primzahl.2 ist eine Primzahl.
    


  • @Belli Das Prog ist auch noch völlig unlogisch, da arbeite ich grad noch dran 😅
    Aber ich dachte immer, dass alles, was auf dem Heap liegt, eines Poitners bedarf? 😕


  • Mod

    @JTR666 sagte in Klassenvektor in main() ausgeben:

    @Belli Das Prog ist auch noch völlig unlogisch, da arbeite ich grad noch dran 😅
    Aber ich dachte immer, dass alles, was auf dem Heap liegt, eines Poitners bedarf? 😕

    Stell dir mal vor, du selber würdest die Klasse vector programmieren. Mach mal einen groben Entwurf, was da so drin sein könnte.



  • @JTR666 sagte in Klassenvektor in main() ausgeben:

    Aber ich dachte immer, dass alles, was auf dem Heap liegt, eines Poitners bedarf? 😕

    Ja! Aber den Pointer besitzt und verwaltet vector intern bereits.
    Dein vector liegt auf dem Stack (wenn Du ihn benutzt, anstelle eines Zeigers auf einen vector) - aber die Elemente des vector liegen auf dem Heap!



  • @JTR666 sagte in Klassenvektor in main() ausgeben:

    @Belli Es ist nur ein Experiment, ja^^
    Was ist denn daran so abwegig?
    Für jede Erklärung bin ich offen! 🙂

    Was ist daran abwegig: siehe dein thread hier 😉 Die Fehlerquote ist einfach höher. Gerade das erzeugen und das sauberere Aufräumen, dann noch die Gültigkeit, wenn man den Pointer weitergibt.
    Du hast in einer Funktion die den Pointer übergeben bekommt, hast du keine Möglichkeit zu prüfen ob der Pointer überhaupt gültig ist, es sei denn es ist ein "nullptr".



  • @JTR666 sagte in Klassenvektor in main() ausgeben:

    @Belli Das Prog ist auch noch völlig unlogisch, da arbeite ich grad noch dran 😅
    Aber ich dachte immer, dass alles, was auf dem Heap liegt, eines Poitners bedarf? 😕

    Das Problem ist, dass man bei Pointer auch korrekt die Speicherverwaltung machen muss, und das bietet sehr großen Raum Fehler zu machen. Wenn Du Dein Programm unter Linux laufen lässt, schau Dir mit valgrind an, was Dein Programm so macht. Du hältst nämlich nicht die rule-of-five ein. Dein auskommentierter Destruktor wäre auch nicht korrekt, wenn er aktiv wäre.



  • @john-0 Ich hab in den Destruktor einfach danach noch

    delete[] this->primes;

    geschrieben.


  • Mod

    @JTR666 sagte in Klassenvektor in main() ausgeben:

    @john-0 Ich hab in den Destruktor einfach danach noch

    delete[] this->primes;

    geschrieben.

    Zeig mal deine Klasse. 100 Prozent, dass du es falsch gemacht hast und jemand hier einen Laufzeitfehler durch Benutzung deiner Klasse auslösen kann. 95 Prozent, dass ich dieses Programm bereits jetzt erraten kann:

    prime a, b;
    a = b;
    

    Außerdem: Warum? Die richtige Lösung ist "Keine Pointer, niemals". Denn du brauchst sie nicht, und kannst nur alles falsch machen. Warum wurstelst du nun noch weiter damit herum?



  • @JTR666 sagte in Klassenvektor in main() ausgeben:

    @john-0 Ich hab in den Destruktor einfach danach noch

    delete[] this->primes;

    geschrieben.

    Der Sinn und Zweck eines std::vector<int> im Vergleich zu int*liegt gerade darin, dass man keine händische Speicherverwaltung mehr machen muss. D.h.

    class prime
    public:
        vector<int> primes;
    ...
    };
    

    ist ausreichend und löst Dein Problem bereits. Denn der std::vector<int> macht für dich alles notwendige. Wenn Du willst, kannst Du nur zu Übungszwecken alternativ mit int* probieren wie das aussieht. Wenn das zu etwas gut ist, dann hoffentlich dafür, dass manuelle Speicherverwaltung ein sehr steiniger Weg ist, und man es daher so gut wie nie (als Anfänger nie!) benutzt.



  • Beim std::vector handelt es sich um eine Einfach verkettete Liste.
    Dazu gibt es z.B. bei YouTube sehr viele gute Tutorials.



  • @theAnfänger77 sagte in Klassenvektor in main() ausgeben:

    Beim std::vector handelt es sich um eine Einfach verkettete Liste.

    Das ist falsch. Es handelt sich um ein dynamisch wachsendes Array. Eine einfach verkettete Liste findet sich unter std::forward_list.



  • @theAnfänger77 sagte in Klassenvektor in main() ausgeben:

    Beim std::vector handelt es sich um eine Einfach verkettete Liste.
    Dazu gibt es z.B. bei YouTube sehr viele gute Tutorials.

    Das Merkmal einer Liste ist, dass einem Element mindestens ein benachbartes Element bekannt ist. Das ist beim Vector nicht der Fall.
    Ein vector<T> ist intern einfach nur ein Array von T-Objekten, also vom Typ T*.
    D.h. alle Objekte liegen nebeneinander im Speicher, sind aber nicht miteinander verknüpft. Sie sind einfach nur "da". 😃

    Durch die Konstruktion des Vector muss ein großer Speicherklotz am Stück verfügbar sein. D.h. wenn du 1 Mio Objekte der Größe 1Kb im Vector lagern willst, muss im Arbeitsspeicher 1GB am Stück verfügbar sein. Bei stark fragmentiertem Speicher kann man da durchaus auf Probleme stoßen.

    Die Liste hingegen hat im Gegensatz zum Vector Overhead bei jedem einzelnen Knoten, verbraucht also mehr Speicher.



  • @It0101 sagte in Klassenvektor in main() ausgeben:

    Durch die Konstruktion des Vector muss ein großer Speicherklotz am Stück verfügbar sein. D.h. wenn du 1 Mio Objekte der Größe 1Kb im Vector lagern willst, muss im Arbeitsspeicher 1GB am Stück verfügbar sein. Bei stark fragmentiertem Speicher kann man da durchaus auf Probleme stoßen.

    Das hängt davon ab, auf was das C++ läuft. Auf einem modernen OS wie IX oder die Win NT Varianten, ist das kein Thema mehr, weil das OS den Speicher in virtuellen Adressräumen der Applikation zur Verfügung steht, und das OS interne Listen mit physikalischen Speicherseiten führt, die können in der Realität wild fragmentiert sein. Einige OS haben auch RAM Defragmentierer, die Speicherseiten physikalisch verlagern, damit die mehrere physikalische Seiten hintereinander abfolgen. D.h. solange man die interne Verwaltung der Speicherseiten des OS nicht überfordert, passiert da nichts Dramatisches mehr.

    Anders sieht das auf einem embedded System aus, da hat man nur einen hosted Compiler und der bekommt dann schnell mal Probleme.



  • @john-0
    Danke fürs Update 🙂


  • Mod

    @It0101 sagte in Klassenvektor in main() ausgeben:

    @john-0
    Danke fürs Update 🙂

    Naja, das ist seit ca. 40 Jahren so…
    Relevant kann aber die programminterne Fragmentierung des virtuellen Adressraums sein, aber das ist heute auch noch genauso wie vor 40 Jahren, außer dass der Adressraum seither größer geworden ist.



  • @SeppJ sagte in Klassenvektor in main() ausgeben:

    Naja, das ist seit ca. 40 Jahren so…

    Für die große Masse der Nutzer aber nicht. Windows 1.0, 2.0, 3.0, 3.1, WfW 3.11, 95, 98, 98SE, Me haben das nicht gehabt. Erst mit XP (Oktober 2001) kam Win NT zu den normalen Nutzern. Bei MacOS kam der Wechsel von MacOS 9 zu MacOS X ungefähr zum selben Zeitpunkt. Also seit ca. 20 Jahren gibt es das für Normalos.


Log in to reply