C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Überladen von operator()

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Guest






PostPosted: Sat Nov 18, 2006 6:57 pm    Post subject: Überladen von operator() Reply with 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).

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





PostPosted: Sat Nov 18, 2006 10:07 pm    Post subject: Re: Überladen von operator() Reply with quote



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





PostPosted: Sat Nov 18, 2006 10:09 pm    Post subject: Re: Überladen von operator() Reply with quote



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





PostPosted: Sun Nov 19, 2006 1:08 am    Post subject: Re: Überladen von operator() Reply with quote

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





PostPosted: Sun Nov 19, 2006 10:22 pm    Post subject: Re: Überladen von operator() Reply with quote

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





PostPosted: Mon Nov 20, 2006 2:38 am    Post subject: Re: Überladen von operator() Reply with quote

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





PostPosted: Mon Nov 20, 2006 12:51 pm    Post subject: Re: Überladen von operator() Reply with quote

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






PostPosted: Wed Nov 22, 2006 10:11 am    Post subject: Re: Überladen von operator() Reply with quote

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





PostPosted: Sun Nov 26, 2006 10:20 pm    Post subject: Re: Überladen von operator() Reply with quote

<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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.