2017-06-09 4 views
1

habe ich den folgenden Code in meiner Individual.hpp Datei:Aufruf statische Funktion Zeiger aus statischer Methode

typedef string (Individual::*getMethodName)(void);  
static getMethodName currentFitnessMethodName; 
static string getCurrentFitnessMethodName(); 

Und das auf meiner CPP-Datei:

string Individual::getCurrentFitnessMethodName(){ 
    return (Individual::*currentFitnessMethodName)(); 
} 

Ich bin mit Funktionszeigern in anderen Teilen meines Codes, aber immer im gleichen Objekt Kontext, also ich (this -> * thingyMajigger) (params), aber mit diesem statischen Aufruf bekomme ich den folgenden Fehler:

Erwartet unqualifizierte ID

Ich habe mehrere Permutationen des genannten Codes ausprobiert, aber keiner scheint zu funktionieren. Kann jemand etwas Licht teilen?

Prost

+0

Da 'currentFitnessMethodName' ein Zeiger auf die nicht statische Elementfunktion ist, muss' Individual' aufgerufen werden. In Ihrer statischen Funktion 'getCurrentFitnessMethodName' gibt es keinen' this' Zeiger. Haben Sie ein anderes 'Individual'-Objekt, das Sie dort verwenden können? – aschepler

+0

Warum verwenden Sie den statischen Zeiger und den Funktionszeiger, anstatt ihn nur mit object.method korrekt auszuführen? – stark

+0

@aschepler, nein ich nicht. Ich habe das als Beispiel beschrieben. –

Antwort

1

Ihre typedef ist, was Sie up ist in Unordnung. Statische Methoden sind nur reguläre Funktionen, die zufällig Zugriff auf geschützte/private statische Member ihrer Klasse haben.

Ändern der typedef einfach:

typedef string (*getMethodName)(void); 

Erstere Syntax ist für nicht-statische Element-Methoden.


Als Beispiel wird die folgende nicht kompilieren:

#include <iostream> 
#include <string> 

using namespace std; 
class Foo { 
public: 
    typedef string (Foo::*staticMethod)(); 

    static staticMethod current; 

    static string ohaiWorld() { 
     return "Ohai, world!"; 
    } 

    static string helloWorld() { 
     return "Hello, world!"; 
    } 

    static string callCurrent() { 
     return Foo::current(); 
    } 
}; 

Foo::staticMethod Foo::current = &Foo::ohaiWorld; 

int main() { 
    cout << Foo::callCurrent() << endl; 
    Foo::current = &Foo::helloWorld; 
    cout << Foo::callCurrent() << endl; 
    return 0; 
} 

Aber die Änderung der typedef von

typedef string (Foo::*staticMethod)(); 

zu

typedef string (*staticMethod)(); 

erlaubt es zu kompilieren - und wie erwartet gibt es aus:

Verwandte Themen