Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Array mit Funktionspointern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.11.2008, 14:47 Uhr
dafduf



Huhu zusammen, da bin ich mal wieder mit meinen Problemen und hoffe auf Euro Unterstützung und Ratschläge.

Folgender Quellcode:

C++:
#include <iostream>

typedef void (*Funktionspointer)(std::string,int);

void ausgabe1(std::string name,int zahl)
{
    std::cout<<"ausgabe1 ="<<name<<zahl<<std::endl;
}

void ausgabe2(std::string name,int zahl)
{
    std::cout<<"ausgabe2 ="<<name<<zahl<<std::endl;
}

int main(void)
{
    Funktionspointer meinfunktionspointer[2];
    int phase;
    
    phase=1;
    meinfunktionspointer[0]=ausgabe1;
    meinfunktionspointer[1]=ausgabe2;
    
    for (int i=0;i<=100;i++)
    {        
        meinfunktionspointer[phase-1]("eins",1);
        if (phase==2)
            phase=1;
        else
            phase++;        
    }

    std::cout<<"ENDE"<<std::endl;
    return 0;
}



Hier klappt die Zuweisung der Funktionen an die entsprechenden Pointer im Array.

Nun möcht ich das ganze in eine Klasse packen.
Dazu der folgende Code:

C++:
#include <iostream>

typedef void (*Funktionspointer)(std::string,int);

class Meineklasse
{
private:
    Funktionspointer meinfunktionspointerarray[2];
public:    
    Meineklasse()
    {
        meinfunktionspointerarray[0]=ausgabe1;
        meinfunktionspointerarray[1]=ausgabe2;
    }
    void ausgabe1(std::string name,int zahl)
    {
        std::cout<<"ausgabe1 ="<<name<<zahl<<std::endl;
    }
    void ausgabe2(std::string name,int zahl)
    {
        std::cout<<"ausgabe2 ="<<name<<zahl<<std::endl;
    }
    virtual ~Meineklasse(){}
};

int main(void)
{
    Meineklasse* meinobjekt=new Meineklasse();
    delete meinobjekt;

    std::cout<<"ENDE"<<std::endl;
    return 0;
}



Tja und nun meckert der Compiler mit folgendem Hinweis:

../main.cpp: In constructor `Meineklasse::Meineklasse()':

../main.cpp:12: Fehler: Argument des Typs »void (Meineklasse:(std::string, int)« passt nicht zu »void (*)(std::string, int)«

../main.cpp:13: Fehler: Argument des Typs »void (Meineklasse:(std::string, int)« passt nicht zu »void (*)(std::string, int)«

Mir ist nicht klar, wieso auf einmal die nicht mehr zueinanderpassen.
Ziel ist es in einem aufwendigeren Programm dem Array mit den Funktionspointern, erst während der Erstellung eines Objektes dieser Klasse die entsprechenden Funktionen in das Array einzusortieren, bzw den Pointern zuzuweisen, also während der Konstruktor der Klasse aufgerufen wird.

Wäre super, wenn ihr mir erklären könntet, was da schief läuft und wie es richtig geht.Vielen Dank im Voraus.

Grüße, dafduf.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.11.2008, 15:55 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von dafduf:
hoffe auf Euro Unterstützung


ich auch!

scnr,
Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 28.11.2008 um 15:55 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.11.2008, 16:31 Uhr
Tommix



Hallo,
Du müßtest die Funktionen static machen, damit das funktioniert. "Normale" Member-Funktionen bekommen noch den jeweiligen this-Zeiger als unsichtbaren Parameter, deshalb stimmt die Signatur nicht.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.11.2008, 21:15 Uhr
0xdeadbeef
Gott
(Operator)


Methodenzeiger verhalten sich notgedrungen anders als normale Funktionszeiger. Zum einen wegen des zusätzlichen Parameters, den Tommix schon erwähnte, zum anderen, weil die Möglichkeit einer virtuellen Methode behandelt werden muss.

Auch, wenn die Parameter übereinstimmten (also noch MeineKlasse* als Parameter in der Liste stünde) ließe sich eine Methode einem normalen Funktionszeiger deswegen nicht zuweisen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.11.2008, 13:51 Uhr
dafduf



Vielen Dank erstmal für eure Erklärungen. Gibt es aber eine Möglichkeit diesen Array aus Funktionspointern mit den Member-Funktionen zu verknüpfen. Vielleicht über diesen this-Zeiger oder so. Falls ja, bitte mit Beispielcode der Zuordnung.

Mit dem static machen der Funktion geht leider nicht, da in dem richtigen Programm die Member-Funktion in noch anderen Klassen vorkommt , die von einer gemeinsamen Basisklasse abstammen. Und so wie ich das verstanden hab, bedeutet das static immer, dass alle Klassen auf diese eine Funktion dann zugreifen und nicht mehr die Funktionen nur der jeweiligen Klasse gehören.

Vielen Dank und noch ein schönes restliches Wochenende.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.12.2008, 03:08 Uhr
0xdeadbeef
Gott
(Operator)


So?

C++:
#include <iostream>

struct A {
  void foo();
};

void A::foo() {
  std::cout << "Hello, world." << std::endl;
}

int main() {
  void (A::*ptr)() = &A::foo;
  A a;
  A *p = &a;

  (a.*ptr)();
  (p->*ptr)();
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 01.12.2008 um 03:12 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: