Klasse: Variablenproblem



  • Hi Leute!

    Ich hab eine Klasse matrix und einen Konstruktor sowie eine Methode dazu geschrieben:

    matrix::matrix(int m, int n)
    {
    	//erzeugt ein eindimensionales Array mit der Länge m*n
    	int size = m*n;
    	feld = new int[size];
    }
    
    matrix::~matrix()
    {
    	delete[] feld;
    }
    
    void matrix::Init()
    {
    	//setzt das Array auf 0
    	for(int i=0; i<(m*n); i++)
    	{
    		feld[i] = 0;
    	}
    }
    

    Im Konstruktor matrix() kann ich ohne weiteres auf die übergegebenen Werte die in m und n stehen zugreifen. In der Methode Init() kann ich aber auf m und nicht zugreifen. Was ist hier dann falsch? Die Variablen m und n sind in der Klasse matrix als private und als int deklariert.

    Wisst ihr was da faul ist?



  • matrix::matrix(int m, int n) : m(m), n(n)
    {
    	//erzeugt ein eindimensionales Array mit der Länge m*n
    	int size = m*n;
    	feld = new int[size];
    }
    


  • Dein Konstruktor hat zwei Parameter, m und n.
    Diese nutzt du zur Berechung der Größe. Danach sind sie weg.
    Du musst deinen Klassenvariablen die Werte auch zuweisen!



  • vip@r schrieb:

    Wisst ihr was da faul ist?

    Da sind einige Sachen faul. Unter anderem auch das new/delete, da wirst du Probleme bekommen sobald du den anderen Bug gefixt hast, weil du die Fünferregel verletzt hast.
    Hier, ein Tipp: Übersetzungstabelle



  • Dein Konstruktor hat zwei Parameter, m und n.
    Diese nutzt du zur Berechung der Größe. Danach sind sie weg.
    Du musst deinen Klassenvariablen die Werte auch zuweisen!

    Ah, natürlich! Die Konstruktorliste!

    Wenn ich nun eine Klasse hab in der eine einzige int Variable (n) deklariert wird und ich diese im Konstruktor ohne Konstruktorliste verwende kann ich aber im nachfolgenden Beispiel in der Methode Init() auch OHNE Konstruktorliste auf den Inhalt von n zugreifen. Warum geht das dann hier? Hier der Code:

    myFeld::myFeld(int n)
    {
    	//erzeugt statisches Array in Abhängigkeit von n
    	//this->n = n;
    	feld = new int[n];
    }
    
    myFeld::~myFeld()
    {
    	delete[] feld;
    }
    
    void myFeld::Init()
    {
    	//setzt das statische Array auf 0
    	for(int i=0; i<n; i++)
    	{
    		feld[i] = 0;
    	}
    }
    


  • Weißt du, dass er die Dreier-/Fünferregel verletzt hat?
    Trotzdem nicht zu empfehlen.



  • Nathan schrieb:

    Weißt du, dass er die Dreier-/Fünferregel verletzt hat?

    Die Erfahrung sagt mir, dass es ziemlich sicher so ist.



  • Was ist denn die Fünferregel?

    Ist das die Regel der Großen 3 aber noch mit Move CopyConstructor und Move Assignment Operator?



  • Würde ich in dem Kontext vermuten.



  • Du kannst natürlich auch ohne Konstruktorliste deinen Membervariablen Werte zuweisen. Die Konstruktorliste ist nur bei Membervariablen notwendig, die keinen Defaultkonstruktor besitzen. Sie ist allerdings auch oft effizienter, weil so die Membervariablen gleich beim Erstellen initialisiert werden und nicht erst danach.



  • Präziser ausgedrückt: Tauchen Membervariablen nicht in der Init.-liste auf, wird der Defaultkonstruktor aufgerfuen, bei PODs ist der Wert zufällig. Anschließend wird noch eine Zuweisung durchgeführt. Btw: Wird der Overhead vom Compiler wegoptimiert?



  • Nathan schrieb:

    Btw: Wird der Overhead vom Compiler wegoptimiert?

    Bei PODs schon.
    Bei anderen Klassen ist es möglich, je nachdem wie Konstruktor und Assignment-Operator aussehen, und wie gut der Compiler optimieren kann.


Log in to reply