Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++/CLI mit .NET ::  Vektoraddition     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
jeff26
Unregistrierter




Beitrag jeff26 Unregistrierter 22:21:07 04.03.2012   Titel:   Vektoraddition            Zitieren

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
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 1359
Beitrag Mechanics Mitglied 22:40:39 04.03.2012   Titel:              Zitieren

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.
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1357
Beitrag icarus2 Mitglied 22:45:17 04.03.2012   Titel:              Zitieren

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
C++:
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 ;)
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1357
Beitrag icarus2 Mitglied 23:32:47 04.03.2012   Titel:              Zitieren

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:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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(); }
};
jeff26
Unregistrierter




Beitrag jeff26 Unregistrierter 23:54:59 04.03.2012   Titel:              Zitieren

zuerst vielen Dank für die antworten. nun nochmal mein code formatiert:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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??
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1357
Beitrag icarus2 Mitglied 00:04:06 05.03.2012   Titel:              Zitieren

Also mit dieser main muesste es funktionieren:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
C++:
1
2
3
4
5
6
7
8
        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?
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 1359
Beitrag Mechanics Mitglied 00:09:01 05.03.2012   Titel:              Zitieren

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


Ja, schaut nach einem Memory Leak aus.
jeff26
Unregistrierter




Beitrag jeff26 Unregistrierter 00:14:12 05.03.2012   Titel:              Zitieren

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.

C++:
    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
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1357
Beitrag icarus2 Mitglied 00:19:23 05.03.2012   Titel:              Zitieren

Der Aufruf
C++:
vektor x = z + a;

wird vom Compiler zu
C++:
vektor x = z.operator+(a);

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




Beitrag jeff26 Unregistrierter 00:44:26 05.03.2012   Titel:              Zitieren

alles klar, hab ich verstanden.
dankeschön
c++.de :: C++/CLI mit .NET ::  Vektoraddition   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.