gibt es eine Verwendung für & func oder Klasse :: func in C ++?
-
03-07-2019 - |
Frage
Das scheint im Widerspruch. Warum verwenden wir & Beispiel :: func anstelle von Beispiel :: func? gibt es eine Verwendung für Beispiel :: func oder & exampleFunction? es scheint nicht, wie wir einen Verweis auf eine Funktion machen können, so dass das Beispiel :: func ausgeschlossen ist. und ich kann nicht einen Weg finden verwenden & exampleFunction seit exampleFunction bereits einen Zeiger zurückgibt.
#include <iostream>
class Example {
public:
void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)();
typedef void (*ExampleFunction_t)();
int main()
{
Example e;
ExampleFunc_t f = &Example::func;
ExampleFunction_t f2 = exampleFunction;
(e.*f)();
f2();
return 0;
}
Lösung
Weil das ist, wie die Standard-Zeiger auf Funktionen definiert.
Sie haben eigentlich immer den Adreßoperator &
verwenden, um einen Zeiger auf eine Funktion zu erhalten, aber für normale Funktionen und statische Member-Funktion, eine implizite Konvertierung von Funktion zu Zeigern-to-Funktion im Standard definiert ist.
Dies ist definiert nicht für ein (nicht statisch) memberfunction weil Sie einen L-Wert auf eine nicht statische memberfunction nicht erhalten können.
Aus der C ++ Standard:
4.3 Funktions-to-Zeiger Umwandlung
- Ein L-Wert von Funktionstyp T kann mit einem R-Wert vom Typ umgewandelt werden „Zeiger auf T“. Das Ergebnis ist ein Zeiger auf die Funktion.
mit Fußnote 52:
Diese Umwandlung gilt niemals auf nicht-statische Member-Funktionen, weil ein L-Wert, der zu einer nicht-statischen Elementfunktion verweist kann nicht erhalten werden.
Ich denke, dass sie lieber nur erlauben & Funktion, aus Konsistenzgründen, sondern dass die implizite Konvertierung ist einfach ein Artefakt des C Erbe ...
Andere Tipps
Der Punkt wird mit Funktionszeigern . Für eine sehr grobe Beispiel: Angenommen, Sie haben eine Klasse mehrere Elementvariablen, die von dem Sie benötigen, können die Elemente eines Arrays dieser Klasse zu sortieren, wie folgt aus:
struct CL {
int x, y, z;
};
bool sort_by_x(const CL& obj1, const CL& obj2);
bool sort_by_y(const CL& obj1, const CL& obj2);
bool sort_by_z(const CL& obj1, const CL& obj2);
...
CL obj[100];
...
sort(obj, obj+100, sort_by_x);
...
sort(obj, obj+100, sort_by_y);
...
sort(obj, obj+100, sort_by_z);
Hier std :: sort verwendet wird, eine Reihe von CL Objekte zu sortieren. Schauen Sie sich den dritten Parameter, ist es Name einer Funktion. Die std :: Sortierfunktion kann einen Funktionszeiger in dritte Parameter nehmen, und verwenden diese Funktion als Komparator das Array zu sortieren. Es ist bis zu uns, wie sort_by_ * Funktionen zu definieren, so dass std :: sort funktionieren wie erwartet.