Wo liegt hier der Fehler ?



  • Ich hab hier ein kurzes Codestück, und hier soll es beim Aufruf von set1 ein Problem geben ? Ich finde aber leider nicht heraus welches. Und wie kann ich das Problem vermeiden, ohne die Funktion set1 zu ändern ?

    Ich weiß nur daß es mit dem Copykonstruktor zusammenhängt !

    Dieter

    class PRFGClass{
    public:
    	PRFGClass();
    	PRFGClass(int b);
    	~PRFGClass();
    	void set(int b);
    	int get();
    private:
    	int *a;
    };
    
    PRFGClass::PRFGClass()
    {
    			  a=new int(100);
    }
    
    PRFGClass::PRFGClass (int b)
    {
    	a=new int(b);
    }
    
    PRFGClass::~PRFGClass ()
    {
    	delete a;
    }
    
    void PRFGClass::set(int b)
    {
    	*a=b;
    }
    
    int PRFGClass::get()
    {
    	return *a;
    }
    
    void set1(PRFGClass t)
    {
    	t.set(1);
    }
    
    void set2(PRFGClass &t)
    {
    	t.set(2);
    }
    


  • Hallo,

    wenn du nicht weisst, ob und was es für ein Problem gibt, woher soll das dann ein anderer wissen? Was geht denn nicht so, wie du dir das vorstellst? Etwas mehr Informationen wären schon nicht schlecht.



  • Du hast keinen CopyConstructor implementiert - und der Default CopyCtor erstellt nur flache Kopien (du brauchst aber tiefe).



  • Shade er hat doch einen copy-ctor mit ner tiefen kopie:

    PRFGClass::PRFGClass (int b)
    {
        a=new int(b);
    }
    


  • Das ist ja nur ein Code Ausschnitt welcher bei einer Klausur von einem meiner Nachhilfeschüler gefragt wurde, und da ich auch keine Ahnung hatte wollte ich euch fragen ob einer von euch die Fragestellung beantworten kann.

    Das Codestück ist weiter oben schon abgebildet, und die gestellten Fragen dazu waren wie folgt:

    -Welches Problem wird durch den Aufruf von set1 erzeugt ?
    -Wird dieses Problem auch bei dem Aufruf von set2 erzeugt?
    -Wie kann dieses Problem, ohne die Funktion set1 zu ändern behoben werden?

    Und der Vortragende hat nach der Klausur noch den Tip gegeben, daß es was mit dem Copyconstruktor zu tun hat.

    mfg Dieter



  • DieterBrandt schrieb:

    -Welches Problem wird durch den Aufruf von set1 erzeugt ?

    Es wird eine flache Kopie erstellt. dh, es findet keine kopie des Wertes statt, sondern nur der Zeiger wird kopiert. Das übergebene Objekt zeigt somit auf den selben Speicher wie das ursprüngliche Objekt.

    Wenn das übergebene Objekt jetzt out-of-scope geht, wird der Speicher freigegeben -> das ursprüngliche Objekt zeigt auf toten Speicher.

    -Wird dieses Problem auch bei dem Aufruf von set2 erzeugt?

    nein, da keine Kopie stattfindet

    -Wie kann dieses Problem, ohne die Funktion set1 zu ändern behoben werden?

    einen CopyCtor implementieren, der eine tiefe Kopie erstellt.

    wenn dir falche und tiefe Kopie nix sagt:

    int* p=new int;
    
    int* f=p; //flache kopie
    
    int* t=new int(*p); //tiefe kopie
    

    am besten nachfragen wenn es unklar ist.

    PS:
    schöne Aufgabe



  • Danke, mit deiner ausführlichen Erklärung verstehe ich es auch.

    Habe mich auch gerade schlau gemacht über flache und tiefe Kopien.

    Bin zwar eher ein Programmier Muffel, aber umso mehr ich mich damit beschäftige, desto mehr Spass macht es. Hätte nie gedacht, daß C++ so eine umfangreiche und mächtige Sprache ist.

    mfg Dieter



  • DieterBrandt schrieb:

    Hätte nie gedacht, daß C++ so eine umfangreiche und mächtige Sprache ist.

    das 'schlimmste' kommt alles noch 😉



  • Ach jetzt sehe ich wo der Fehler steckt, t in set1 ist ja by value und gar keine
    Referenz 🤡


Anmelden zum Antworten