Pointer auf eine Member-Funktion



  • Hallo,

    ich hab gerade keine Idee mehr... Ich hab folgenden Code-Ausschnitt:

    class Data;
    
    typedef double (Data::*value_func)(int);
    
    class Data
    {
    public:
      double Value(int i) { return 1.0*i; }
    
      double Max(value_func func, int max_index)
      {
        double temp = this->func(0);                             // error: ‘class Data’ has no member named ‘func’
        for (int i=0; i<=max_index; ++i)
          if (temp<this->func(i))                                // error: ‘class Data’ has no member named ‘func’
            temp = this->func(i);                                // error: ‘class Data’ has no member named ‘func’
      }
    };
    
    int main()
    {
      Data data;
      std::cout << data.Max(data.Value, 10) << std::endl;        // error: no matching function for call to ‘Data::Max(<unresolved overloaded function type>, int)’
                                                                 // note: candidates are: double Data::Max(double (Data::*)(int), int)
    }
    

    Die Fehler-Meldungen stehen als Kommentar hinter den entsprechenden Zeilen.

    Funktionspointer von nicht-static Member-Funktionen sind im Allgemeinen nicht möglich. Aber in diesem Fall sollten ja die Funktion Max auf die Daten der eigenen Klasse zugreifen, d.h. der this-Pointer wäre vorhanden. Allerdings wird der Ausdruck 'this->func' nicht so interpretiert, wie ich mir das wünschen würde 🙂

    Hmmm... kann mir jemand einen Tipp geben?

    Grüße, K.B.



  • schau mal in die libsvm,
    da wird sowas gemacht mit den Kernelfunktionen, spontan weiß ich das jetzt auch nicht



  • mach es so 🙂

    class Data;
    
    typedef double (Data::*value_func)(int); 
    
    class Data 
    { 
    public: 
    	double Value(int i) { return 1.0*i; } 
    
    	double Max(value_func func, int max_index) 
    	{ 
    		double temp = (this->*func)(0);                             // ->*   und    ()   !!
    		for (int i = 0; i <= max_index; ++i)
    			if (temp < (this->*func)(i))                                 
    				temp = (this->*func)(i); 
    		return temp; 
    	} 
    }; 
    
    int main() 
    { 
    	Data data; 
    	std::cout << data.Max(&Data::Value, 10) << std::endl;        // addresse von der klassenfunktion. diese funktion hat noch kein objekt 
    
    }
    


  • Vielen Dank für die Hilfe!



  • ist zwar schon spät, aber meines erachtens gehört da kein this-> davor... ^^

    gn8 : >



  • unskilled schrieb:

    ist zwar schon spät, aber meines erachtens gehört da kein this-> davor... ^^

    Und von was willst Du den ->* Operator aufrufen, wenn nicht von this? 😉



  • gibts da nicht den ::* operator um mit dem klassennamen aufzurufen
    (wieder ungetestet)



  • helferlein schrieb:

    gibts da nicht den ::* operator um mit dem klassennamen aufzurufen
    (wieder ungetestet)

    Du brauchst doch aber eine gültige Instanz, wenn du eine Memberfunktion aufrufen willst?!


Anmelden zum Antworten