Dieser Code kompiliert (mit g ++ (GCC) 6.3.1) und scheint zu "arbeiten". Aber ich bin sehr skeptisch, ob es gute Praxis darstellt.Ist es eine gute Übung, einen Zeiger auf eine Elementfunktion als Zeiger auf eine C-Funktion zu werfen
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
class ThreadObj
{
public:
void *memberFunction(void*);
void startThread(void);
static int w;
};
int ThreadObj::w = 13;
void* ThreadObj::memberFunction(void*)
{
w = 17;
return 0;
}
void ThreadObj::startThread(void)
{
void * (*p)(void *) = *((void * (*)(void *))&ThreadObj::memberFunction);
pthread_t tid;
if (pthread_create(&tid, 0, p, this) == 0)
pthread_detach(tid);
}
int main(int argc, char *argv[])
{
ThreadObj thr;
thr.startThread();
return 0;
}
Casting einen Zeiger auf eine Elementfunktion als Zeiger auf eine C-Funktion und vorbei this
als Daten (zu viel) auf die Barmherzigkeit zu verlassen scheint, wie der Compiler wählt diese zu interpretieren/kompilieren.
Dies wurde bereits behandelt, aber nicht endgültig beantwortet.
Wie kann dieses Beispiel gebrochen werden?
Sie markiert diese als 'C', aber es gibt keine solche Dinge wie Mitgliederfunktionen in 'C'. – PaulMcKenzie
Es ist fehlerhaft, da der Zeiger auf Funktionen verschiedener Typen nicht definiert ist. –
Die Verwendung eines Funktionszeigers, der mit 'reininterpret_cast' (oder einer gleichwertigen C-Umwandlung) umgewandelt wurde, außer dem Zurücksetzen auf den Originaltyp, ist per Definition ein definiertes Verhalten. Siehe '7)' [hier] (http://en.cppreference.com/w/cpp/language/reinterpret_cast#Explanation). Hier geht es nicht so sehr um gute Praktiken, wie es in C++ nicht erlaubt ist. Was Sie * tun * können, ist eine neue statische Methode zu definieren, die einen Zeiger auf eine Instanz der Klasse akzeptiert und stattdessen einen Funktionszeiger auf diese Methode verwendet. –