Typenproblem bei Funktionszeiger



  • Huhu!
    Ich möchte einen Thread innerhalb einer Klasse erstellen und will das folgendermaßen realisieren:

    int ircclient::irc_connect(char *HostnameOrIP, int Port)
    {
    	...
    
    	//Message Dispatcher starten
        int  iret1;
        iret1 = pthread_create( &dispatcher_thread, NULL, message_dispatcher, (void*)&s);
    
    	return 0;
    }
    
    void ircclient::*message_dispatcher( void *socket )
    {	
       ...
    }
    

    Wenn ich das kompilieren will, bekomme ich in Zeile 7 folgenden fehler:

    Fehler: Argument des Typs >>void* (ircclient::)(void*)<< passt nicht zu >>void*(*)(void*)<<
    

    Wenn ich die Threadfunktion außerhalb der Klasse definiere, lässt sich der Code Problemlos kompilieren:

    int ircclient::irc_connect(char *HostnameOrIP, int Port)
    {
    	...
    
    	//Message Dispatcher starten
        int  iret1;
        iret1 = pthread_create( &dispatcher_thread, NULL, message_dispatcher, (void*)&s);
    
    	return 0;
    }
    
    void *message_dispatcher( void *socket )
    {	
       ...
    }
    

    Die Funktion muss aber unbedingt in der Klasse sein! Was mache ich falsch, bzw ist das überhaupt möglich?





  • am einfachsten:

    #if !defined (IRC_CLIENT_HPP__INCLUDED)
    #define IRC_CLIENT_HPP__INCLUDED
    
    #if (_MSC_VER >= 1300)
    #pragma once
    #endif // (_MSC_VER >= 1300)
    
    #include <string>
    
    namespace irc
    {
        class client
        {
           // ...
        public:
            int connect(std::string const&, const unsigned short);
    
        private:
            inline static void _message_dispatcher(void* ptr_this)
            { static_cast<client*>(ptr_this)->message_dispatcher(); }
    
        public:
            virtual void message_dispatcher();
    
        // ...
        };
    }; // irc
    
    #endif // IRC_CLIENT_HPP__INCLUDED
    
    #include "irc\client.hpp"
    #include <iostream> // std::clog ;)
    
    namespace irc
    {
        int client::connect(std::string const& host, const unsigned short port)
        {
            // ...
            const int result(::pthread_create(&dispatcher_thread, NULL, &client::_message_dispatcher, this);
            // ...
            return 0;
        }
    
        void client::message_dispatcher()
        {
            std::clog << "Dispatching messages!" << std::endl;
        }
    }; // irc
    

    Wenn du noch Parameter an message_dispatcher übergeben willst, musst du eine struct nutzen!


Anmelden zum Antworten