Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Funktions-Zeiger in Klassentemplates

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
03.06.2009, 14:31 Uhr
~FreiherrEintrtt
Gast


Ich habe eine Template-Klasse:

C++:
template <typename T> class A
{
    T (*f) (T x);
    T fBsp1(T x);     // beide
    T fBsp2(T x);     // implementiert
    ...
};

template <typename T>
T A<T>::fBsp1(T x)
{
    ...
}

template <typename T>
T A<T>::fBsp2(T x)
{
    ...
}



Die Funktion f soll eine bestimmte Abbildung enthalten, die der Benutzer selbst wählen kann. Dabei sollen bereits mehrere Beispiel-Funktion in der Klasse vorhanden sein, so dass man z.B. per

C++:
double y(double x) { ... }

A<double> a;
a.f = A<double>::fBsp1;   // geht nicht
a.f = y;  // geht


eine der Vorlagen verwenden kann.
In dieser Form nimmt der Compiler das allerdings nicht an (invalid use of non-static member function). Wie muss ich diese Bsp-Funktionen definieren, dass sie angenommen werden? Oder macht man so etwas nicht und benutzt eher globale Definitionen wie z.B. y(x) oben im Beispiel. Damit hat der Compiler nämlich keine Probleme.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.06.2009, 16:09 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst am Rande angemerkt: Es handelt sich bei einer Klassenvorlage noch nicht um eine Klasse, das ist ein wichtiger Unterschied. Eine Klasse wird erst draus, wenn sie konkretisiert wird.

Aber zu deinem Problem: A<double>::fBsp1 kann nicht in double(*)(double), sondern nur in double (A<double::*)(double) gestopft werden - es ist eine Methode. Wenn fBsp1 das Objekt a nicht benötigt, kannst du eine statische Funktion daraus machen, die dann in double(*)(double) passt:

C++:
template <typename T> class A
{
    T (*f) (T x);
    static T fBsp1(T x);
    // ...
};


Ansonsten muss f halt ein Methodenzeiger werden:

C++:
template <typename T> class A
{
    T (A::*f) (T x);
    T fBsp1(T x);
    // ...
};


...und dann nachher beim Aufruf als

C++:
result = (a.*a.f)(3.141);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.06.2009, 13:47 Uhr
~FreiherrEintrtt
Gast


Danke!

Ich habe mich für die nicht-statische Variante entschieden, da f auf Werte aus der Klasse zugreifen muss.
Allerdings finde ich den Aufruf (a.*a.f)(x) etwas unschön und würde das gerne hinter einer anderen Methode f verbergen:

C++:
template <typename T> class A
{
    T (A::*pf) (T x);
    T fBsp1(T x);
    T f(T x);
    // ...
}


der Aufruf soll dann so aussehen:

C++:
A<double> a;
a.pf = &A<double>::fBsp1;
a.f(x);  // <- Kapselung


Wie muss ich in der Methode f den Aufruf über den Zeiger pf formulieren? Ich hab folgendes versucht:

C++:
template <typename T>
T A<T>::f(T x)
{
    return ((A<T>*)this)->*pf(x);
}


bekomme aber die Meldung
" must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((A<double>*)this)->A<double>::pf (...)’ "
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.06.2009, 16:36 Uhr
0xdeadbeef
Gott
(Operator)


Wenn ich mich recht entsinne:

C++:
return (this->*pf)(x);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: