Objekt als Rückgabetyp von Memberfunktion



  • Hallo Leute,

    ich stehe noch am Anfang der objektorientieren Programmierung und habe da ein Problem.
    Zu erst einmal das Problem, was ich lösen möchte.
    Ich möchte zweidimensionale Vektoren erzeugen, mit einer Class Vector, die ich dann Addieren und Subtrahieren möchte und das Ergebniss möchte ich dann wiederrum in einen Vector schreiben. Laut Aufgabenstellung sollte die Klasse Addieren und Subtrahieren als Memberfunktionen haben.

    Zu erst einmal habe ich mir meine Klasse Vector in eine Headderdatei geschrieben:

    //Header Vector.h
    #include <iostream>
    
    class Vector
    {
    	private:
    
    		double x;
    		double y;
    
    	public:
    
    		//Konstruktor
    		Vector() : x(0.0), y(0.0)
    		{
    		}
    
    		Vector(double _x, double _y) : x(_x), y(_y)
    		{
    		}
    
    		//Memberfunktionen
    		void get_vector()
    		{
    			std::cout << "(" << x << "|" << y << ")" << std::endl;
    		}
    
    		double get_x()
    		{
    			return x;
    		}
    
    		double get_y()
    		{
    			return y;
    		}
    
    		Vector Addieren(Vector _v1, Vector _v2)
    		{
    			Vector sum_vec;
    
    			sum_vec.x = _v1.x + _v2.x;
    			sum_vec.y = _v1.y + _v2.y;
    
    			return sum_vec;
    		}
    
    		Vector Subtrahieren(Vector _v1, Vector _v2)
    		{
    			Vector sum_vec;
    
    			sum_vec.x = _v1.x - _v2.x;
    			sum_vec.y = _v1.y - _v2.y; 	
    
    			return sum_vec;
    		}
    };
    

    Die Memberfunctionen übernehmen meine Vektoren als Übergabeargument und sollen als Ergebniss wieder einen Vector zurückgeben.

    In Main dann werden meine beiden Vectoren die ich Addieren / Subtrahieren möchte gebildet und ausserdem zwei weitere Vectoren die die Ergebnisse aufnehmen sollen.

    //main.cpp
    #include <iostream>
    #include "Vector.h"
    
    int main()
    {
    	Vector vec1(1 ,2), vec2(3, 4), vec3, vec4;
    
    	vec1.get_vector();
    	vec2.get_vector();
    
    	vec3.Addieren(vec1, vec2);
    	vec3.get_vector();
    
    	vec4.Subtrahieren(vec1, vec4);
    	vec4.get_vector();
    
    	return 0;
    }
    

    in meinen Ergebniss-Vectoren vec3 und vec4 wird aber leider das Ergebniss nicht reingeschrieben sondern es wird (0|0) ausgeben, also wie der Standardkonstruktor das initialisiert.
    Vielleicht erkennt einer meinen Fehler oder ich habe ganz großen Unsinn gebastelt.

    Ich bedanke mich auf jeden Fall schonmal.

    Gruß

    Alex



  • Du schreibst das Ergebnis in einen Rückgabewert, verwendest diesen aber nicht weiter.



  • Das was daddy_felix geschrieben hat.

    Und: wenn die Funktionen Addieren und Subtrahieren this nicht angreifen, dann sollten sie normalerweise static sein.

    Also

    static Vector Addieren(Vector _v1, Vector _v2)
            {
                Vector sum_vec;
    
                sum_vec.x = _v1.x + _v2.x;
                sum_vec.y = _v1.y + _v2.y;
    
                return sum_vec;
            }
    
            static Vector Subtrahieren(Vector _v1, Vector _v2)
            {
                Vector sum_vec;
    
                sum_vec.x = _v1.x - _v2.x;
                sum_vec.y = _v1.y - _v2.y;  
    
                return sum_vec;
            }
    
    // ...
    
        vec3 = Vector::Addieren(vec1, vec2);
        vec3.get_vector();
    
        vec4 = Vector::Subtrahieren(vec1, vec4);
        vec4.get_vector();
    

    Weiters: Funktionen wie Addieren und Subtrahieren nennt man normalerweise operator + bzw. operator - , dann kann man nämlich schreiben:

    vec3 = vec1 + vec2;
        vec3.get_vector();
    
        vec4 = vec1 - vec4;
        vec4.get_vector();
    

    Und Funktionen wie get_vector macht man normalerweise als "stream insertion operator" (=> googeln), dann kann man schreiben

    vec3 = vec1 + vec2;
        std::cout << "vec3 = " << vec3 << "\n";
    
        vec4 = vec1 - vec4;
        std::cout << "vec4 = " << vec4 << "\n";
    

    Und dann sieht das ganze schon fast professionell aus 😉



  • Hallo,

    vielen Dank für eure Hilfe. Stehe wie gesagt noch am Anfang.
    Das mit dem this Zeiger habe ich rausgefunden, womit mein ursprüngliches Problem gelöst wurde.
    Die Einwände von hustbaer hören sich sehr vernüftig an, ich werde das mal ausprobieren.

    Danke nochmals


Log in to reply