PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Operator überladen....



Sym
13-11-2004, 14:50
Hi,

ich bin relativ neu in der C++-Scene (Java ist eigentlich mein Gebiet ;)) und deshalb habe ich wohl ein paar Anfängerprobleme.

Und zwar: ich habe mir eine Klasse Vector gebastelt, welche folgende Überladung enthält:

double Vector::operator*(Vector *v) {

double r = 0;

for(int i=0; i<_dim; i++) {
r += _v[i]*v->get(i);
}

return r;

}
Wenn ich jetzt aber zwei Vectoren mittels v*w multiplizieren möchte, kommt folgender Fehler:

main.cpp:33: error: invalid operands of types `Vector*' and `Vector*' to binary `operator*'
Ich weiß nicht, was ich damit anfangen soll, denn ich habe ja extra diesen Operator überladen. Komisch, komisch, wahrscheinlich habe ich wieder irgendwie ein Pointer oder Referenzproblem. Das ist nach langer und intensiver Java-Zeit für mich leider noch Neuland. Vielleicht könnte ihr mir da ja helfen.

[edit] warum werden denn die Kursivtags auch in der Code-Umgebung genutzt? Ist das normal so? Naja, nach dem "r += _v" soll da jedenfalls ein eingeklammertes i stehen. ;)

locus vivendi
13-11-2004, 15:13
Der wahrscheinlichste Grund ist, das du versuchst einen Zeiger mit einem zweiten zu multiplizieren. Das ist in C++ nicht erlaubt. Aber ich muss raten. Es wäre besser wenn du ein vollständiges Programm postest, welches den Fehler hervorruft. Meine persönliche Meinung übrigens ist, das es keine gute Idee ist, für deinen Vektor die Multiplikation mit einem Zeiger zu erlauben.

wraith
13-11-2004, 15:15
double Vector::operator*(Vector& v) {
....
}
....
Vector v,w;
double d = v * w;

Sym
13-11-2004, 15:16
Der wahrscheinlichste Grund ist, das du versuchst einen Zeiger mit einem zweiten zu multiplizieren. Das ist in C++ nicht erlaubt. Aber ich muss raten. Es wäre besser wenn du ein vollständiges Programm postest, welches den Fehler hervorruft. Meine persönliche Meinung übrigens ist, das es keine gute Idee ist, für deinen Vektor die Multiplikation mit einem Zeiger zu erlauben.
Jupp, ich versuche zwei Zeiger zu multiplizieren. Aber wie mache ich das sonst? Die Vectoren liegen ja nur als Zeiger darauf vor.

Sym
13-11-2004, 15:19
double Vector::operator*(Vector& v) {
....
}
....
Vector v,w;
double d = v * w;

Ich habe die Vektoren mittels "Vector *v = new Vector(1)" angelegt, weil man mit sagte, dass man die Instanzen besser nicht auf den Stack legt.

wraith
13-11-2004, 15:22
Ich habe die Vektoren mittels "Vector *v = new Vector(1)" angelegt, weil man mit sagte, dass man die Instanzen besser nicht auf den Stack legt.
Wer ist man?
Ist auch völlig egal, du mußt dann also die Zeiger dereferenzieren.


Vector v = new Vector;
Vector w = new Vector;
double d = *v * *w;

Aber leg' die Instanzen besser auf dem Stack an.

Sym
13-11-2004, 15:27
Danke, das hat nun funktioniert. Aber warum sollte ich Objekte auf den Stack legen? Der Stack ist ja nun einmal begrenzt. Der Heap nicht wirklich und deshalb erzeuge ich einen Pointer auf den Speicher.

Oder habe ich da was grundsätzlich nicht verstanden?

wraith
13-11-2004, 15:36
Aber warum sollte ich Objekte auf den Stack legen? Der Stack ist ja nun einmal begrenzt. Der Heap nicht wirklich und deshalb erzeuge ich einen Pointer auf den Speicher.

Sicherlich ist der Stack begrenzter, aber wir reden hier ja nicht davon, daß du 10000 Vector-Objekte anlegen sollst.
Wenn du das vorhaben würden, dann wären diese Vector-Objekte wohl in einer anderen Struktur eingebettet (die selber auf dem Heap liegt).
Also zb. ein std::vector von Vector(en).

Du hast aber ebend auch mehr Sicherheit, wenn deine Objekte auf dem Stack liegen, du mußt dich nicht um Aufräumarbeiten (delete) kümmern (kein GC, der das für dich erledigt).

Wie ist deine interne Struktur?Ein festes Array, oder wir zur Laufzeit (mit new), Speicher angelegt?
Dann würde ja eh der Großteil auf dem Heap liegen.

Also wenn du new/delete vermeiden kannst, dann tue das.

Sym
13-11-2004, 15:42
Ok,

vielen Dank. Die Daten, die nachher genutzt werden, sind wesentlich größer als der Stack.
Wie oben schon geschrieben, habe ich bisher nur mit Java gearbeitet, doch in unserem Institut (in dem ich jetzt meine Diplomarbeit schreibe, liegt die Bibliothek als C++-Bibliothek vor. Es gibt da zwar ein Java-Framework, aber es wird wohl mehr auf Objectiv-C und C++ gesetzt.
Deshalb schreibe ich am Anfang die kleinen Klassen auch alle selber. Aber wie man sieht sind mir ein paar Punkte noch nicht klar.

Ok, wenn ich das jetzt richtig verstanden habe, ist es kein Problem, wenn das Array auf dem Heap liegt. Dann mache ich das wohl so.

Nochmals vielen Dank. Man lernt halt nie aus.

anda_skoa
13-11-2004, 18:09
Ok, wenn ich das jetzt richtig verstanden habe, ist es kein Problem, wenn das Array auf dem Heap liegt. Dann mache ich das wohl so.


Das Array innerhalb der Vector Klasse legst du besser schon auf den Heap, nur bei den Vector Instanzen ist das nicht unbedingt nötig, weil sie selbst ja sehr klein sind (Beinhalten ja wahrscheinlich dann nur einen Pointer auf das Array und eine Angabe über die Länge)

Abgesehen davon wäre es vermutlich vernünftiger, die Standardcontainer zu benutzen.

Ciao,
_

locus vivendi
13-11-2004, 19:17
Vielleicht habe ich das ja nicht richtig verstanden, aber wäre es, wenn du eine Bibliothek für deine Diplomarbeit (Mathe? Ingenieurwesen?) brauchst, nicht besser eine existierende Mathe-Bibliothek zu benutzen?
Vielleicht willst du ja mal hier nach was Passendem schauen:
http://www.oonumerics.org/oon/

Sym
14-11-2004, 16:31
Das Array innerhalb der Vector Klasse legst du besser schon auf den Heap, nur bei den Vector Instanzen ist das nicht unbedingt nötig, weil sie selbst ja sehr klein sind (Beinhalten ja wahrscheinlich dann nur einen Pointer auf das Array und eine Angabe über die Länge)

Abgesehen davon wäre es vermutlich vernünftiger, die Standardcontainer zu benutzen.

Ciao,
_
Jupp, so läuft das nun bei mir. Langsam verstehe ich da mehr. ;)

Vielleicht habe ich das ja nicht richtig verstanden, aber wäre es, wenn du eine Bibliothek für deine Diplomarbeit (Mathe? Ingenieurwesen?) brauchst, nicht besser eine existierende Mathe-Bibliothek zu benutzen?
Vielleicht willst du ja mal hier nach was Passendem schauen:
http://www.oonumerics.org/oon/
Sicher könnte ich eine bestehende Bibliothek nutzen, aber ich habe mit den kleinen Dingen schon genug Übergangsprobleme. Pointer und Speichernutzung ist unter Java nicht nötig bzw. nicht machbar. Deshalb mache ich erst einmal alles zu Fuß und wenn ich sicherer bin, kann ich es immer noch anders machen. ;) Aber trotzdem danke.