 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Guest
|
Posted: Sat Nov 18, 2006 6:57 pm Post subject: Überladen von operator() |
|
|
Hallo zusammen!
Ich hab' eine Klasse, die eine Matrix darstellt. Sie besitzt ein
Attribut
double ** data;
welche die Matrizenwerte beinhaltet.
Jetzt möchte ich über den () schreibend und lesend auf die Matrix
zugreifen.
Bsp:
Matrix m(5,5);
m(2,1) = 3.1;
( data[2][1] soll nun den Wert 3.1 haben).
Ich weiß leider nicht genau, wie ich das schreibend realisiere, lesend
hab' ich das mal bei einer anderen Klasse gemacht, aber schreibend hab'
ich leider keinen Schimmer.
Habt ihr eine Idee?
Danke, Karsten |
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sat Nov 18, 2006 10:07 pm Post subject: Re: Überladen von operator() |
|
|
kenduron (AT) web (DOT) de wrote:
| Quote: | Hallo zusammen!
Ich hab' eine Klasse, die eine Matrix darstellt. Sie besitzt ein
Attribut
double ** data;
welche die Matrizenwerte beinhaltet.
Jetzt möchte ich über den () schreibend und lesend auf die Matrix
zugreifen.
|
Das ist Unsinn. Das willst Du nicht. Es gibt in C++ keine
mehrdimensionalen Index-Operatoren, sondern nur eindimensionale. Wenn
diese eine nicht konstante Referenz liefern, dann kanst Du dieser
Referenz etwas zuweisen, so Du einen passenden Zuweisungoperator hast.
Du brauchst also eine Matrixklasse und eine Spalten- oder Zeilenklasse,
sowie eine Zellenklasse (kann auch einfach ein doulbe sein). Der
Indexoperator der Matrixklasse muß eine nicht konstante Refderenz auf
die über den Index angegbene Zeile oder Spalte vom Typ Zielen- bzw.
Spaltenklasse liefern. UAf die wendest Du erneut eine Index-Operator an,
der entsprechend eine nicht konstante Referenz auf eine Einzelzelle
dieser kannst Du dann einen neuen Wert zuweisen oder den vorhanden Wert
auslesen.
double d = m[1][0]; // Zelle lesen
m[1][0] = d; // Zelle schreiben |
|
| Back to top |
|
 |
Alexander Müller Guest
|
Posted: Sat Nov 18, 2006 10:09 pm Post subject: Re: Überladen von operator() |
|
|
Den Rückgabewert einfach als Referenz kennzeichnen:
double& operator()(int zeile, int spalte)
{
return data[zeile][spalte];
}
Den kannst du lesen und schreiben.
Alex
<kenduron (AT) web (DOT) de> schrieb im Newsbeitrag
news:1163854676.296514.6940 (AT) f16g2000cwb (DOT) googlegroups.com...
Hallo zusammen!
Ich hab' eine Klasse, die eine Matrix darstellt. Sie besitzt ein
Attribut
double ** data;
welche die Matrizenwerte beinhaltet.
Jetzt möchte ich über den () schreibend und lesend auf die Matrix
zugreifen.
Bsp:
Matrix m(5,5);
m(2,1) = 3.1;
( data[2][1] soll nun den Wert 3.1 haben).
Ich weiß leider nicht genau, wie ich das schreibend realisiere, lesend
hab' ich das mal bei einer anderen Klasse gemacht, aber schreibend hab'
ich leider keinen Schimmer.
Habt ihr eine Idee?
Danke, Karsten |
|
| Back to top |
|
 |
Heinz Saathoff Guest
|
Posted: Sun Nov 19, 2006 1:08 am Post subject: Re: Überladen von operator() |
|
|
Moin,
Georg Maaß schrieb...
| Quote: | Ich hab' eine Klasse, die eine Matrix darstellt. Sie besitzt ein
Attribut
double ** data;
welche die Matrizenwerte beinhaltet.
Jetzt möchte ich über den () schreibend und lesend auf die Matrix
zugreifen.
Das ist Unsinn. Das willst Du nicht. Es gibt in C++ keine
mehrdimensionalen Index-Operatoren, sondern nur eindimensionale. Wenn
diese eine nicht konstante Referenz liefern, dann kanst Du dieser
Referenz etwas zuweisen, so Du einen passenden Zuweisungoperator hast.
|
Er sagt aber, daß er das will! Und möglich ist es durchaus, den '()'-
Operator so zu nutzen, auch wenn's der gewohnten Schreibweise für Array-
Indizierung wiederspricht. 'Unsinn' würde ich das deshalb nicht
unbedingt nennen.
- Heinz |
|
| Back to top |
|
 |
Andre Poenitz Guest
|
Posted: Sun Nov 19, 2006 10:22 pm Post subject: Re: Überladen von operator() |
|
|
Georg Maaß <georg (AT) bioshop (DOT) de> wrote:
| Quote: | Das ist Unsinn. Das willst Du nicht. Es gibt in C++ keine
mehrdimensionalen Index-Operatoren, sondern nur eindimensionale. Wenn
diese eine nicht konstante Referenz liefern, dann kanst Du dieser
Referenz etwas zuweisen, so Du einen passenden Zuweisungoperator hast.
|
Gerade mit operator() kann man aber einen "mehrdimensionalen Index"
simulieren. Und ich halte das fuer sehr sinnvoll.
| Quote: | Du brauchst also eine Matrixklasse und eine Spalten- oder Zeilenklasse,
sowie eine Zellenklasse (kann auch einfach ein doulbe sein).
|
Womoeglich noch mit einzelnen Allokationen pro Zeile bzw Spalte. Fuer
"echte" Numerik kann man sich das eher nicht erlauben...
Andre' |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Mon Nov 20, 2006 2:38 am Post subject: Re: Überladen von operator() |
|
|
Georg Maaß wrote:
| Quote: | kenduron (AT) web (DOT) de wrote:
Ich hab' eine Klasse, die eine Matrix darstellt. Sie besitzt ein
Attribut
double ** data;
welche die Matrizenwerte beinhaltet.
Jetzt möchte ich über den () schreibend und lesend auf die Matrix
zugreifen.
Das ist Unsinn. Das willst Du nicht. Es gibt in C++ keine
mehrdimensionalen Index-Operatoren, sondern nur eindimensionale.
|
Laut Barton und Nackman gibt sogar keine Index-Operatoren, nur
einen Projektions-Operator: []. Zufälligerweise entsprechen
Indizieren und Projektionnehmen bei eindimensionalen Arrays
derselben Sache. Sie schlagen also vor, [] für Projektion und ()
für Indizieren zu benutzen.
Am Ende also ist es eine Stilfrage. Ich selber bevorziehe, wohl
[][] für zweidimensionales Indizieren. Wenn einer mir aber sagt,
dass er () benutzen will, sage ich nicht, dass er das nicht
will.
--
James Kanze (Gabi Software) email: james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Mon Nov 20, 2006 12:51 pm Post subject: Re: Überladen von operator() |
|
|
James Kanze schrieb:
| Quote: | Am Ende also ist es eine Stilfrage. Ich selber bevorziehe, wohl
[][] für zweidimensionales Indizieren. Wenn einer mir aber sagt,
dass er () benutzen will, sage ich nicht, dass er das nicht
will.
|
Der Operator() hat den Vorteil, daß er die Indizierung verdeckt, und man
sich als Benutzer nicht darum kümmern muß, ob's nun dünnbesetzte
Matrizen, Matrizen mit sequentieller Allokation oder Matrizen mit Zeiger
auf Zeiger ... Semantik sind.
Die [][][]... Variante wirkt gerade im mehrdimensionalen Fall arg
gestelzt, und die Konstruktion zusätzlicher Objekte für den Zugriff im
Fall sequentieller Allokation macht die Sache auch nicht gerade besser. |
|
| Back to top |
|
 |
Guest
|
Posted: Wed Nov 22, 2006 10:11 am Post subject: Re: Überladen von operator() |
|
|
kenduron (AT) web (DOT) de schrieb:
| Quote: | Hallo zusammen!
Ich hab' eine Klasse, die eine Matrix darstellt. Sie besitzt ein
Attribut
double ** data;
welche die Matrizenwerte beinhaltet.
Jetzt möchte ich über den () schreibend und lesend auf die Matrix
zugreifen.
Bsp:
Matrix m(5,5);
m(2,1) = 3.1;
( data[2][1] soll nun den Wert 3.1 haben).
|
Danke für eure Antworten.
Auch wenn es für manche doch stilistisch etwas ungewöhnlich vorkommt,
so ist es dennoch gewollt.
Die Idee mit der Referenz war super.
Danke. |
|
| Back to top |
|
 |
Gilbert Brands Guest
|
Posted: Sun Nov 26, 2006 10:20 pm Post subject: Re: Überladen von operator() |
|
|
<kenduron (AT) web (DOT) de> schrieb im Newsbeitrag
news:1163854676.296514.6940 (AT) f16g2000cwb (DOT) googlegroups.com...
Hallo zusammen!
class Matrix {
double& operator()(int i, int j){
return a[i*dim1+j];
}
double* a;
int dim1,dim2;
}
alles andere macht ziemlichen Ärger. |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|