Class Function
-
#include <iostream> using namespace std; class Temperatur { private: // standard is private double celcius; double fahrenheit; public: double leseC(void) {return celcius;}; double leseF(void) {return fahrenheit;}; void speicherC(void); void speicherF(void); }; void Temperatur::speicherC(void) { cout << "Bitte Celcius eingeben: "; cin >> celcius; fahrenheit = 9.0 / 5.0 * celcius + 32.0; } void Temperatur::speicherF(void) { cout << "Bitte Fahrenheit eingeben: "; cin >> fahrenheit; celcius = 5.0 / 9.0 * (fahrenheit - 32.0); }; int main() { Temperatur temp; temp.speicherC(); cout << "Wert in Celcius: " << temp.leseC() << endl; cout << "Wert in Fahrenheit :" << temp.leseF() << endl; return 0; }temp.speicherC; cout << "Wert in Celcius: " << temp.leseC << endl; cout << "Wert in Fahrenheit :" << temp.leseF << endl;obwohl das hier auch funktioniert, erzielt aber eine ganz andere wirkung!!!
warum ist das so?
-
temp.leseC();führt die Funktion/Methode aus und gibt deren Resultat zurück.
temp.leseC;verwendet den Funktionsnamen als Pointer (sogenannte Funktionszeiger) und spuckt lediglich die Adresse aus, an der die Funktion im Speicher steht.
-
Hallo
ohne die Klammern werden die Adressen der Methoden selber ausgegeben, anstatt deren Rückgabewerte.
So etwas braucht man zum Beispiel beim zuweisen von Funktionspointern.bis bald
akari
-
achso
cout << "Wert in Celcius: " << temp.leseC() << endl; cout << "Wert in Celcius: " << temp.leseC << endl;Ergebnis: leseC() (richtig)
leseC liefert die zahl "1"sieht nicht nach einer adresse aus oder?
-
achso
cout << "Wert in Celcius: " << temp.leseC() << endl; cout << "Wert in Celcius: " << temp.leseC << endl;Ergebnis: leseC() (richtig)
leseC liefert die zahl "1"sieht nicht nach einer adresse aus oder?
-
Sieht so aus als ob dein compiler auch member-functionpointer nach boolean umwandelt.
Meiner macht's nur mit normalen function-pointern.Warnung: the address of `void speicherC()', will always be `true'Kurt
-
CStoll schrieb:
temp.leseC();führt die Funktion/Methode aus und gibt deren Resultat zurück.
temp.leseC;verwendet den Funktionsnamen als Pointer (sogenannte Funktionszeiger) und spuckt lediglich die Adresse aus, an der die Funktion im Speicher steht.
Letzteres ist zumindest in Standard-C++ nicht korrekt. Zum einen muss Die Adresse einer nicht-statischen Memberfunktion *immer* mit dem Adressoperator gebildet werden (&Foo::bar). Zum anderen kann die Kombination auf Objekt und Memberfunktion (temp.leseC) nur zum Aufruf der Memberfunktion selbst verwendet werden. Das Ganze ist aber kein speicherbarer Typ und erst recht kein Memberfunktionszeiger.
Der Compiler ist in diesem Punkt also nicht standardkonform.