Function Pointer in MFC mit mehreren Klassen
-
Hallo,
das Standardwerk zu Function Pointer habe ich schon gelesen, komme aber in MFC in C++ nicht damit klar. In C unter Verwendung einer Struktur funktioniert es.
Folgendes Problem:
Im Projekt gibt es mehrere Klassen mit den gleichen Funktionen (natürlich unterschiedlicher Inhalt)
- ClassA::Init(void), ClassA::Close(void), ClassA::GetIrgendwas(int, CString);
- ClassB::Init(void), ClassB::Close(void), ClassB::GetIrgendwas(int, CString);
.
.
Aus einer anderen Klasse möchte ich diese Funktionen in der Form aufrufen:
func[i].Close() usw.Hat jemand ne Idee für die Deklaration und den Aufruf?
Danke,
WorstCase
-
Bist Du Dir sicher das Du den Zeiger einer Membermethode eines Objektes (bzw. eine Statische FUnktion) haben willst ?
Dann wäre => ins C++ Forum angesagt
Ansonsten wäre es vllt. möglich das Du eher einen Zeiger auf ein Object brauchst und von dieser Instanz die Methode aufrufen willst?
-
Ja, ich wollte gerne über den den Zeiger auf eine Membermethode eines Objektes zugreifen. Letzteres hört sich gut an. Werde es mal probieren.
Allerdings hätte ich gerne gewußt, wie das mit den Zeigern auf Methoden funktioniert. Geht das vielleicht nur mit statischen Methoden?WorstCase
-
Hallo,
mit der Deklaration
void (TClass::*fpClose)(void);
funktioniert es, wenn die Zuweisung einer Methode der gleichen Klasse erfolgt:
fpClose = TClass::Close;
Wird der Zeiger aber auf eine Methode einer anderen Klasse mit gleicher Deklaration der Methode
class TClass2 : public CObject
{
public:
void Close (void);
}gesetzt,
fpClose = TClass2::Close;
meldet MSC++ den folgenden Fehler:
error C2440: '=': 'void (__thiscall TClass2::)(void)' kann nicht in 'void (__thiscall TClass::)(void)' konvertiert werden
Soll ich etwa mit switch, case arbeiten? Das kann doch noch nicht alles sein.
Bitte helft mir.
WorstCase
-
Hat wirklich niemand ne Idee???
-
Hi,
du könntest eine Basisklasse machen (ADT), von der deine beiden Klassen abgeleitet werden und dann nicht die Funktionen der beiden Klassen aufrufen, sondern die der Basisklasse.
Grüße Rapha
-
das ist es nicht.
Ich habe ja mehrere Klassen, die alle was anderes machen: Sie geben letztendlich alle einen Wert zurück. Nur das Protokoll, um an diesen Wert zu kommen, ist ein anderer. Welches Protokoll verwendet wird, hängt von der Konfiguration ab.WorstCase
-
Aber beide Klassen verwenden doch eine Funktion, die die gleiche Parameter hat und das gleiche "macht":
ClassA::GetIrgendwas(int, CString);
ClassB::GetIrgendwas(int, CString);Hier könntest du einen ADT verwenden.
Ansonsten hilft nur statische Methoden

Grüße Rapha