Klassenvektor in main() ausgeben



  • 
    ```//Ein kleiner Primzahltester
    
    #include <iostream>
    #include <math.h>
    #include <vector>
    using namespace std;
    
    class prime
    {
    public:
        vector<int> *primes;
        int calc;
        int num_input;
    
        prime()
        {
            primes = new vector<int>;
        }
    
        void calculator(int &testing_number);
        /*calculator(calc);*/
        /*void set_vector() {primes.push_back(cal);}*/
        void divisor();
        /*~prime()
        {
            cout << "R.I.P. Vector";
    
        }*/
    };
    
    void prime::calculator(int &testing_number)
    {
        cout << "calculator springt an." << endl;
        int mod;
        for(int i=2; i <= testing_number; i++)
        {
            mod = testing_number % i;
    
            if(testing_number == i)
                primes->push_back(testing_number);
    
            if(i < testing_number && mod == 0)
                break;
        }
    
        cout << "calculator ist fertig." << endl;
    }
    
    int main()
    {
        prime p1;
        int testing_number, mod;
        cout << "Zu testende Zahl: ";
        cin >> testing_number;
        p1.num_input = testing_number;
        int test_area = sqrt(testing_number);
    
        if(testing_number % 2 == 0)
            cout << testing_number << " ist keine Primzahl.";
    
        p1.num_input = testing_number;
        for(int i=1; i<=test_area/2; i++)
        {
            testing_number = 2*i+1;
            p1.calculator(testing_number);
        }
    
        vector<int> *divisors = p1.primes;
        for(int i=0; i < p1.primes->size(); i++)
        {
            cout << p1.primes[i] << endl;
        }
    
        cout << testing_number << " ist eine Primzahl." << endl;
    
        return 0;
    }```cpp


  • Hey Leute! 🙂
    Ich hoffe ihr hattet einen angenehmen Feiertag! 🙂

    Ich habe nur mal eine Frage, nämlich, wieso ich mit

    for(i=0; i < p1.primes->size(); i++)
    {
    cout << p1.primes[ i ] << endl;
    }

    nicht die einzelnen Elemente meines Klassenvektors primes in der main-Funktion ausgeben kann.
    Denn der Vektor selbst zeigt auf den Heap, und ist somit ein Pointer.
    Aber egal was ich mache, ich bekomme immer nur eine Fehlermeldung á la "no match for 'operator<<' in 'std::cout << *(p1.prime::primes + (unsigned int)(((unsigned int)9) *12u)))'

    Also entweder hat er ab einem bestimmten eingegebenen Wert nicht mehr genug Freispeicher alloziert, weswegen der Vektor dann verlagert wird und der Pointer *primes nicht mehr auf den Vektor zeigt, oder ich mach irgendwas anderes falsch...

    Ich danke euch schon mal im Voraus für die Antworten! 🙂
    JTR



  • @JTR666

    cout << (*p1.primes)[i] << endl;
    


  • @Belli Du bist der Beste! Es läuft! 🙂
    Dankee! 🙂



  • Besser wäre es allerdings, Du würdest da überhaupt nicht mit Zeigern rummachen ... dann würdest Du Dir solche und andere Probleme sparen, die Du Dir damit jetzt aufhalst. 🧐
    Ich hoffe ja, dass das nur irgendein krudes Experiment ist ...



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



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


Log in to reply