2017-03-03 6 views
-1

Mein Problem ist, dass ich ein Header-Funktion in einem anderen Header der Funktion als Parameter übergeben will, aber ich erhalte eine Fehlermeldung, weiß ich nicht, was zu tun ist.C++ Passing Funktion als Parameter (zwischen Header)

header1:

class headerClass1{ 
public: 
void funct1(){} 
}; 

header2:

typedef void (*functCall)() 

class headerClass2{ 
public: 
void funct2(functCall fc()){} 
}; 

Haupt:

int main(){ 

headerClass1 *h1=new headerClass1(parameters); 
headerClass2 *h2=new headerClass2(parameters); 

h2->funct2(h1->funct1()); 

^kehrt Fehler "ungültige Verwendung von Leere expresion"

... 
delete h1; 
delete h2; 
return 0; 
} 

Bitte gehen Sie ins Detail, warum das nicht funktioniert.

+1

Es gibt zu viele grundlegende Fehler. Es wird vorteilhaft für Sie sein, durch ein Lehrbuch zu gehen, um die Grundlagen der Sprache richtig zu verstehen. –

+0

'h1-> funct1()' ist ein Aufruf von funct1, '& h1-> funct1' ist die Adresse der Funktion (die übergeben werden muss). In headerClass2 sollte der Parameter von funkt2 in 'void funct2 (functCall fc)' geändert werden. Und dann haben Sie immer noch das Problem, dass Ihre Funktionen Memberfunktionen und keine einfachen Funktionen sind. Es wäre besser, wenn Sie beschreiben, was Sie erreichen möchten. –

Antwort

0

Weil Sie Zeiger angegeben nicht auf Klassenmethode zu funktionieren. Und als Parameter posten Sie nur Funktionsergebnis, das ungültig ist. Sie benötigen einen Methodenzeiger plus einen Objektzeiger.

Leere funct2 (void (headerClass1 :: * pMethod)(), headerClass1 * pObject);

h2-> funct2 (& headerClass1: funct1, h1);

Anruf innerhalb funct2: (. * * PObject pMethod)();

1

Sie haben dort mehrere Fehler.

Um einen Funktionszeiger auf eine Elementfunktion definiert, muss wie folgt erfolgen:

typedef void(headerClass1::*functCall)(void); 

Dann benötigen Sie ein Objekt auf diese Funktionszeiger zu nennen. Hier ist ein funktionierendes Beispiel:

class headerClass1 
{ 
public: 
    void funct1() 
    { 
     std::cout << "funct1" << std::endl; 
    } 
}; 

typedef void(headerClass1::*functCall)(void); 

class headerClass2 
{ 
public: 
    void funct2(headerClass1& o, functCall fn) 
    { 
     std::cout << "funct2" << std::endl; 
     (o.*fn)(); 
    } 
}; 

int main() 
{ 
    headerClass1 c1; 
    headerClass2 c2; 

    c2.funct2(c1, &headerClass1::funct1); 

    return 0; 
} 
Verwandte Themen