2013-05-23 5 views
5

I die Klammer-Operator die folgende Signatur überlasten:die Klammer Aufruf Überlastung einen Zeiger

char& operator()(const int r, const int c); 

Die beabsichtigte Verwendung hierfür wäre:

// myObj is an object of type MyClass 
myObj(2,3) = 'X' 
char Y = myObj(2,3); 

Welche wie ich erwarte, dass funktioniert. Wenn Sie jedoch den Klammeroperator verwenden, wenn Sie mit einem Zeiger arbeiten, wird er gefaltet. Ich möchte tun:

// pMyObj is a pointer to an object of type MyClass 
pMyObj->(2,3) = 'X'; 
char Y = pMyObj->(2,3); 

jedoch solche Syntax ergibt die Fehler Error: expected a member name (in Visual Studio zumindest).

Das folgende funktioniert, aber scheint mir mit einer Dereferenz und mehr Klammern als Argumente verschachtelt.

char X = (*pMyObj)(2,3); 

Gibt es eine Möglichkeit, den -> Operator zu verwenden, um die () Überlastung zu nennen?

+2

'pMyObj-> operator() (2,3)' – juanchopanza

+0

Sind Sie sicher, dass Sie den Zeiger nicht beseitigen können? Wenn nicht, müssen Sie das kleinere Übel wählen. – chris

Antwort

8

Ja, es ist, aber Sie werden es nicht mögen:

pMyObj->operator()(2,3); 
+0

Vielen Dank! Ich hatte 'pMyObj-> operator (2,3)' versucht, aber das funktionierte nicht. Ich denke, es ist ekelhaft, egal was du tust, aber ich denke, ich bevorzuge das! – chessofnerd

+2

@chessofred Nun, eigentlich gibt es einen anderen Weg: Überladen Sie nicht operator() und verwenden Sie stattdessen eine Funktion mit einem lesbaren Namen: zum Beispiel 'pMyObj-> itemAt (2,3)' – Luis

+0

Wow, das war eine sehr nützliche Frage Ich, der ein Problem mit der Erstellung eines Zeigers auf die Memberfunktion 'operator()' von 'std :: uniform_int_distribution 'konfrontiert wurde. Ich kann jetzt einen Klassenzeiger verwenden und die Funktion verwenden, aber wie erstellt man einen Zeiger auf die Elementfunktion direkt? Folgendes scheint bei mir nicht zu funktionieren: 'int (std :: uniform_int_distribution :: * myFunc) (std :: mt19937_64) = & std :: uniform_int_distribution :: operator' – Sudarsan

0

wenn Sie als unten tun

#define SUB operator() 

Dann können Sie Dinge wie diese schreiben ...

pMyObj->SUB(2,3) 

nicht so elegant wie Fortran ;-) aber vielleicht nicht zu hässlich für den tatsächlichen Gebrauch

Verwandte Themen