Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Adresse einer Funktion einer Klasse

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
06.12.2009, 16:36 Uhr
ulfenstein



Hallo,

ich hänge gerade an einem recht einfachen Problem, komme aber nicht drauf:

ich habe eine Klasse mit drei Funktionen, zwei davon überladen

C++:
class A{
public:
  double f();
  double f(double);
  void g();
};


und außerhalb der Klasse eine Funktion von einem function pointer

C++:
double H(double (*func)(double) )
{...}


definiert.

nun soll in der Funktion g() (der Klasse A) die Adresse zur Funktion f(double) (auch in A) an H übergeben werden.

Ich habe

C++:
void A::g()
{
  double c=H(&(this->f(double)) );
  ...
}


mit diversen Abänderungen probiert, komme aber nicht drauf.

Vielen Dank!
Ulfenstein

Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt, Code eingerückt. Nächstes mal selbst machen.


Dieser Post wurde am 06.12.2009 um 17:42 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.12.2009, 17:33 Uhr
0xdeadbeef
Gott
(Operator)


So sollte das gehen:

C++:
static_cast<double(A::*)(double)>(&A::f)


Natürlich wird das in eine

C++:
double H(double (*func)(double) )


nicht reinpassen, weil A::f vom Typ double (A::)(double) ist, nicht vom Typ double()(double).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.12.2009 um 17:43 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.12.2009, 21:30 Uhr
ulfenstein



ok, jetzt ist mir klar, dass double (A::*)(double) und double (*)(double) zwei unterschiedliche Pointertypen sind, gibt es aber keine Möglichkeit den ersten auf den zweiten zu casten?

Sonst bleibt mir wohl nichts anderes übrig als die Funktion H(double (A::*func)(double) ) zu definieren (ich hätte es aber gerne allgemein gehalten, da ich H öfters für diverse Funktionen aufrufe.)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.12.2009, 22:09 Uhr
ao

(Operator)



Zitat:
da ich H öfters für diverse Funktionen aufrufe.


Wie wärs denn mit sowas?

Basisklasse für alle Klassen, die sich per H() aufrufen lassen möchten:

C++:
class CalleeBase
{
public:
    virtual double H (double d) = 0;
};



Alles, was von CalleeBase abgeleitet ist, hat eine Implementierung von double H(double) und kann über einen CalleeBase*-Zeiger aufgerufen werden:

C++:
class A : public CalleeBase
{
public:
  double f();
  double f(double);
  void g();

    virtual double H (double d)
    {
        // hier A::H implementieren
    }
};


Dieser Post wurde am 06.12.2009 um 22:09 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.12.2009, 22:14 Uhr
0xdeadbeef
Gott
(Operator)


Naja, du brauchst auf jeden Fall ein Objekt vom Typ A, um A::f aufzurufen. Wenn du das hast, kannst du allerdings mit Funktionsobjekten arbeiten - wenn dein Compiler TR1 unterstützt, sieht das etwa so aus:

C++:
#include <functional>
#include <iostream>

#ifdef __GNUC__
#include <tr1/functional>
#endif

struct A {
  double f(double x) {
    std::cout << "A::f(" << x << ")" << std::endl;
    return x;
  }
};

double g(double x) {
  std::cout << "g(" << x << ")" << std::endl;
  return x;
}

double call_function(std::tr1::function<double(double)> const &func,
                     double param) {
  func(param);
}

int main() {
  A a;

  using std::tr1::placeholders::_1;

  call_function(g, 10.0);
  call_function(std::tr1::bind(std::mem_fun(&A::f), &a, _1), 20.0);
}


...ansonsten gibt es das ganze auch in Boost.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 06.12.2009 um 22:15 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: