oop code verständisfrage



  • Hallo zusammen,

    ich versuche den folgenden code zu analysieren, habe aber kleine Probleme mit
    der Ausgabe, ich poste einfach mal den code, in den Kommentaren haben ich
    die Wissenlücken mit // ??? kommentiert.

    Der Rest des Programmes und der Ausgabe ist mir soweit klar.

    #include <iostream>
    using namespace std;
    
    class quark
    {
        private:
        long q;
        long u;
    
        public:
        quark(long z = 9) : q(z) { u = q; aus(); }
        void abc(long z) { q = z + u--; aus(); }
        void aus() const { cout << q << " " << u << endl; }
        void operator++()	{q++; u++; aus(); }
        ~quark() { cout << "~Q " << u << endl; }
    
    };
    
    int main()
    {
        quark q1;                   
        quark q2(2);               
        quark q3 = q1;              
        quark *q4 = new quark(4);	
        q1.abc(3);			 
        q2.abc(5);	                 
        ++q3;			
        ++q4;			
        q4->abc(6);			// ???? was bewirkt das?
        ++q2;			
        q2.abc(1);                  
    }
    
    // Ausgabe:
    /*********************
    * 9  9               *          
    * 2  2               *         
    * 4  4               *		
    * 12 8               *		
    * 7  1               *           
    * 10 10              *          
    * 4431 4424          *         // ???, wie entstehen die Werte?
    * 8 2                *		
    * 3 1                *		
    * ~Q 10              *         // Warum taucht hier ~Q 10 auf?         
    * ~Q 1               *         // Warum taucht hier ~Q 1 auf?
    * ~Q 8               *         // Warum taucht hier ~Q 8 auf?
    **********************/
    

    Vielen Dank für die Unterstützung,

    minix



  • minix schrieb:

    int main()
    {
        quark q1;                   
        quark q2(2);               
        quark q3 = q1;              
        quark *q4 = new quark(4);	
    //...
        ++q4;			
        q4->abc(6);			// ???? was bewirkt das?
    

    Das bewirkt undefiniertes Verhalten, weil q4 auf ungültigen Speicher zeigt, an dem sich keine quark-Instanz befindet.



  • der code sieht irgendwie verboten aus. 😉 😃



  • Hallo,

    @minix

    minix schrieb:

    ++q4;
    

    Hier wird der Zeiger inkrementiert und zeigt um die Größe eines quark auf den nächsten Speicherblock, der aber für q4 nicht reserviert wurde. Um den überladenen Inkrementoperator von quark aufzurufen muss du den zeiger q4 erstmal derefenzieren:

    ++(*q4);
    

    MfG
    tuküe



  • Hallo zusammen,

    merci für die Erläuterungen.

    Der code gehört sicher verboten, war allerdings eine
    Informatik-Klausur Aufgabe, ich denke so kann ein Prof. schon
    ganz gut erkennen, ob jemand C++ code versteht oder nicht.

    Ob jemand in der Realität solch einen code schreiben würde, :-),
    eher unwahrscheinlich.

    Viele Grüße,

    alraune


Anmelden zum Antworten