Vektoraddition



  • Hallo zusammmen,
    ich lerne gerade für meine c++ klausur und will eine vektoraddition definieren.
    dabei habe ich die klasse schon gegeben. Bsiher bin ich soweit gekommen:

    #include <assert.h>
    #include <iostream>
    #include <cmath>
    using namespace std;

    class vektor {
    public:
    int dim;
    int *v;

    // Konstruktor, erwartet Dimension als Argument
    // z.b. vektor x(3), y(5), z(3);
    // v = new vektor(4);
    vektor(unsigned int l) {
    dim=l;
    if(l > 0)
    v = new int[l];
    else
    v = NULL;
    };

    vektor operator+(const vektor& v2) {
    assert (dim == v2.dim);
    vektor *newv= new vektor(dim);
    for (unsigned int i = 0; i<dim; i++) {
    newv->v[i] = v[i] + v2.v[i];
    }
    return *newv;
    };

    };

    int main(int arc, char *arg){
    vektor z(3);
    z.v[0] = 1;
    z.v[1] = 2;
    z.v[2] = 3;

    vektor a(3);
    a.v[0] = 1;
    a.v[1] = 1;
    a.v[2] = 1;

    cout << z.operator+(const &a) << endl;

    system("PAUSE");
    return 0;

    }

    nun bringt er mir die fehlermeldung: expected primary expression before const
    könnt ihr mir sagen wo mein fehler ist?
    Vielen Dank



  • cout << z.operator+(const &a) << endl;

    Das schaut falsch aus. Könnte noch mehr Fehler geben, aber wo du dir keine Mühe gemacht hast, deinen Code zu formatieren, werd ich mir keine Mühe machen, ihn zu lesen.



  • Ich zaehle mal ein par Fehler auf:
    1. Du benuzt intern rohe Arrays und nicht std::vector oder std::array
    2. Du erzeugst mit new Objekte, die du nirgends freigibst --> Memory Leak
    3. Nach Ueberladen des +-Operators macht man Additionen mit

    cout << z + a << endl;
    

    4. Du solltest deine Daten Kapseln und nicht direkten Zugriff darauf geben. Gerade fuer eine Vektorklasse bietet es sich natuerlich an den []-Operator zu ueberladen.
    5. Benutze Code-Tags. Die findest du unter den Smileys 😉



  • Ich habe kurz etwas programmiert, das dir zeigt, wie du so etwas loesen konntest. Man koennte das ganze vielleicht noch eleganter loesen aber es sollte dafuer korrekt sein:

    class Vector
    {
    private:
    	std::vector<int> vector;
    public:
    	// Ctor
    	explicit Vector( size_t n ) : vector(std::vector<int>(n)) {}
    
    	// Ueberladung fuer non-const Vector Objekte
    	int& operator[]( const size_t index )
    	{
    		return vector[index];
    	}
    
    	// Ueberladung fuer const-Vector Objekte
    	const int& operator[]( const size_t index ) const
    	{
    		return vector[index];
    	}
    
    	const Vector operator+( const Vector& rhs )
    	{
    		Vector v(dimension());
    		for ( size_t i = 0; i < dimension(); i++ )
    			v[i] = vector[i] + rhs[i];
    
    		return v; // Es wird eine Kopie zurueckgegeben. Nicht sehr effizient, aber etwas einfacher zum implementieren und korrek
    	}
    
    	// Liefert die Groesse des Vektors
    	size_t dimension() const { return vector.size(); }
    };
    


  • zuerst vielen Dank für die antworten. nun nochmal mein code formatiert:

    #include <assert.h>
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    class vektor {
    	public:
    		int dim;
    		int *v;
    
    		// Konstruktor, erwartet Dimension als Argument
    		// z.b. vektor x(3), y(5), z(3);
    		//      v = new vektor(4);
    		vektor(unsigned int l) {
    			dim=l;
    			if(l > 0) 
    				v = new int[l];
    			else
    				v = NULL;
    		};
    
    		vektor operator+(vektor& v2) {
    			assert (dim == v2.dim);
    			vektor *newv= new vektor(dim);
    			for (unsigned int i = 0; i<dim; i++) {
    				newv->v[i] = v[i] + v2.v[i];
    			}
    			return *newv;
            };
    
        };
    
    int main(int arc, char *arg[]){
        vektor z(3);
        z.v[0] = 1;
        z.v[1] = 2;
        z.v[2] = 3;
    
        vektor a(3);
        a.v[0] = 1;
        a.v[1] = 1;
        a.v[2] = 1;
    
        cout << z.operator+(const &a) << endl;
    
    system("PAUSE");
    return 0;
    
    }
    

    hoffe jetzt stimmts mit den code tags
    icarus2, du sagst, dass ich in meiner klasse schon fehler mache.
    nur leider habe ich die klasse so gegeben und das in einer probeklausur.
    ich kann doch nicht den code von meinem prof umschreiben??
    meinst du, dass es zu der gegebene klasse eine main funktion gibt, die das macht was ich will??



  • Also mit dieser main muesste es funktionieren:

    int main(int arc, char *arg[]){ 
    
        vektor z(3); 
        z.v[0] = 1; 
        z.v[1] = 2; 
        z.v[2] = 3; 
    
        vektor a(3); 
        a.v[0] = 1; 
        a.v[1] = 1; 
        a.v[2] = 1; 
    
    	vektor x = z + a;
    	cout << "v = " << "(" << x.v[0] << "," << x.v[1] << "," << x.v[2] <<  ")" << endl;
    
    	system("PAUSE"); 
    }
    

    Dieser Code hat dein Prof geschrieben? Vielleicht sollte dem einmal jemand C++ beibrigen. In der Funktion

    vektor operator+(vektor& v2) {
                assert (dim == v2.dim);
                vektor *newv= new vektor(dim);
                for (unsigned int i = 0; i<dim; i++) {
                    newv->v[i] = v[i] + v2.v[i];
                }
                return *newv;
            };
    

    erzeugt der doch eindeutig ein Memory Leak? Und auch die Sache mit dem oeffentlichen, rohen Array ist doch sehr haesslich.

    Kann mir das jemand bestaetigen, dass es dort ein Memory Leak gibt?



  • icarus2 schrieb:

    Kann mir das jemand bestaetigen, dass es dort ein Memory Leak gibt?

    Ja, schaut nach einem Memory Leak aus.



  • ah ok, der code leuchtet mir ein.
    jab kommt von ihm, muss aber sagen, dass es c++ für mathematiker ist vllt macht das einen unterschied.

    vektor x = z + a;
    

    ist hier das + das von meinem operator+ ? oder ist das das ganz normale mathematische + ??

    vielen dank für die antworten, wär gerade sonst echt am verzweifeln



  • Der Aufruf

    vektor x = z + a;
    

    wird vom Compiler zu

    vektor x = z.operator+(a);
    

    uebersetzt, das heisst es wird die Methode operator+(...) auf das Objekt z aufgerufen.



  • alles klar, hab ich verstanden.
    dankeschön


Anmelden zum Antworten