INT-Wertverlust nach Aufruf eines Konstruktors im Konstruktor.



  • #include <iostream>
    using namespace std;
    
    class Vector {
    
    	static int counter;
    	int x;
    	int y;
    	int z;
    
    public:
    
    	Vector() :
    			x { 1 }, y { 1 }, z{0}{
    		Vector(x, y);
    	}
    
    	Vector(int posx, int posy) :
    			x { posx }, y { posy } {
    		counter++;
    		z = counter;
    	}
    
    
    	void addVector(Vector &v) {
    		x += v.x;
    		y += v.y;
    	}
    
    	void subVector(Vector &v) {
    		x -= v.x;
    		y -= v.y;
    	}
    
    	void info() {
    		cout << "Vektor " << z << " --> " << '[' << x << "," << y << ']'	<< endl;
    	}
    };
    
    int Vector::counter = 0;
    
    int main() {
    	Vector v1, v2 { 5, 6 }, v3 { 7, 8 }, v4 { -3, -40 };
    	v1.info();
    	v2.info();
    	v3.info();
    	v4.info();
    }
    

    Konsolen-AUSGABE********
    Vektor 0 --> [1,1]
    Vektor 2 --> [5,6]
    Vektor 3 --> [7,8]
    Vektor 4 --> [-3,-40]


    Als Erstes, ja ich weiß das ich die Deklaration und die Definition in Zwei Dateien stecken sollte, allerdings ist es hier einfacher. So, mein Problem ist, wie man in der Ausgabe sieht, daß für die 1. Vektor-Objekt-Definition die Elementnummer - "z" zwar im 2. Konstruktor gesetzt wird aber nach Rücksprung in den Aufruf-Konstruktor der "z"-Wert wieder auf 0 steht. Das sieht man da in der Ausgabe da dort "Vektor 0" steht anstatt "Vektor 1". Wenn ich dem ersten Vektor-Objekt auch zwei Werte zu Initialisierung mitgebe wird korrekt gezählt. Die Ausgabe in der Console ist dann wie folgt.

    Konsolen-AUSGABE********
    Vektor 1 --> [-20,45]
    Vektor 2 --> [5,6]
    Vektor 3 --> [7,8]
    Vektor 4 --> [-3,-40]


    Im übrigeben habe ich in dem Buch, das ich gerade durcharbeite, nichts zur Verkettung von Konstruktoren gefunden und meine Implementierung ist einfach nur ein Schuss ins Grüne gewesen. Vielleicht ist das auch einfach nur total unsinniger Syntax. Für einen Tip wäre ich dankbar.

    mfg der UuugUuug

    ps.: Ich hoffe ich habe mich an alle Regeln zur Veröffentlichung eines POSTS gehalten, falls nicht einfach darauf hin weisen. 😎



  • @uuuguuug sagte in INT-Wertverlust nach Aufruf eines Konstruktors im Konstruktor.:

    	Vector() :
    			x { 1 }, y { 1 }, z{0}{
    		Vector(x, y);  //  <<---------
    	}
    

    Was soll das? (die von mir markierte Zeile)
    Diese Zeile erzeugt ein Vector-Objekt und zerstört es gleich wieder. Willst du das? Das ändert nicht this->z!

    Vermutlich möchtest du:

    	Vector() : Vector(1, 1) {
    		z = 0;
    	}
    

    Oder eher - denn das z soll ja vermutlich automatisch ermittelt werden:

    	Vector() : Vector(1, 1) {}
    

    Das nennt sich delegating constructor. Siehe auch https://abseil.io/tips/74

    Stattdessen könntest du auch default-Argumente nehmen.



  • @wob sagte in INT-Wertverlust nach Aufruf eines Konstruktors im Konstruktor.:

    Vector() : Vector(1, 1)

    Ich sagte doch dass das nur eine Vermutung war wie ich einen Konstruktoraufruf mache im Konstruktor. Jetzt wo ich deine Antwort gelesen habe denke ich dass das die Lösung ist. Das Buch dass ich lese ist sehr kurz gehalten und meine Variante wird da nicht behandelt deswegen meine Vermutung. Habe es getestet und funktioniert. Danke.

    ps: Default-Argumente war die Vorgabe der Übung. Ich wollte es aber anders machen und das gelesene Anwenden.



  • @uuuguuug Google: c++ constructor delegation



  • @uuuguuug Ich war aus deinem Text nicht 100%ig schlau geworden, insbesondere war mit ein Rätsel, wie du in der "korrekten" Variante auf -20,45 gekommen bist. Daher habe ich nur allgemein den Code angeschaut und geraten, was das Problem sein könnte.



  • SUPER beantwortet. Der Code sieht jetz wie folgt aus...

    #include <iostream>
    using namespace std;
    
    class Vector {
    
    	static int counter;
    	int x;
    	int y;
    	int z = 0;
    
    public:
    
    	Vector() :
    			Vector(1, 1) {
    	}
    
    	Vector(int posx, int posy) :
    			x { posx }, y { posy } {
    		counter++;
    		z = counter;
    	}
    
    	void addVector(Vector &v) {
    		x += v.x;
    		y += v.y;
    	}
    
    	void subVector(Vector &v) {
    		x -= v.x;
    		y -= v.y;
    	}
    
    	void info() {
    		cout << "Vektor " << z << " --> " << '[' << x << "," << y << ']'
    				<< endl;
    	}
    
    };
    
    int Vector::counter = 0;
    
    int main() {
    	Vector v1, v2 { 5, 6 }, v3 { 7, 8 }, v4 { -3, -40 };
    	v1.info();
    	v2.info();
    	v3.info();
    	v4.info();
    
    }
    
    

    Danke noch einmal an ALLE für die Tips und kompettente Hilfe!

    Und sorry an Alle daß meine Formulierung nicht perfekt war/ist.

    PS2: in der korrekten Variante hatte ich den Quellcode auf:

    Vector v1{-20,45}, v2 { 5, 6 }, v3 { 7, 8 }, v4 { -3, -40 };

    geändert.... Es hatte da eben funktioniert weil der 2 Konstruktor aufgerufen wurde. Du weißt schon 😀


Log in to reply