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;
} 
War es hilfreich?

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

     
      
  1. 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.
  2.   

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top