Probleme mit abgeleiteter Klasse
-
Hallo zusammen!
Der GCC-Compiler beschwert sich über Zeile 21 in der IRCBot.cpp.
Fehlermeldung:../IRC/IRCBot.cpp: In member function ‘int IRCBot::connectIRC()’: ../IRC/IRCBot.cpp:28: error: no matching function for call to ‘IRCBot::hook_irc_command(const char [13], int (IRCBot::*)(char*, irc_reply_data*, void*))’ ../IRC/IRC.h:79: note: candidates are: void IRC::hook_irc_command(char*, int (*)(char*, irc_reply_data*, void*)) make: *** [IRC/IRCBot.o] Error 1Hat jemand vielleicht eine Idee, wie man das hinbekommen könnte?
IRCBot.cpp
#include <iostream> #include <stdio.h> #include <pthread.h> #include <unistd.h> #include "IRCBot.h" using namespace std; IRCBot::IRCBot() : IRC() { //Konstruktor } int IRCBot::connectIRC() { IRCBot conn; conn.hook_irc_command("irc response", &IRCBot::IRCCommandHandler); conn.start("irc.efnet.ch",6667,"test","test","test","password"); conn.join("#test"); conn.message_loop(); return 0; } int IRCBot::IRCCommandHandler(char* params, irc_reply_data* hostd, void* conn) { IRCBot* irc_conn=(IRCBot*)conn; /* notice that you are passed a pointer to the connection object */ irc_conn->disconnect(); return 0; }IRCBot.h
#ifndef IRCBOT_H_ #define IRCBOT_H_ #include "IRC.h" class IRCBot : public IRC { public: IRCBot(); int connectIRC(); int IRCCommandHandler(char*, irc_reply_data*, void*); int end_of_motd(char* params, irc_reply_data* hostd, void* conn); private: }; #endif /*IRCBOT_H_*/IRC.cpp
[...] void IRC::hook_irc_command(char* cmd_name, int (*function_ptr)(char*, irc_reply_data*, void*)) { if (!hooks) { hooks=new irc_command_hook; hooks->function=0; hooks->irc_command=0; hooks->next=0; insert_irc_command_hook(hooks, cmd_name, function_ptr); } else { insert_irc_command_hook(hooks, cmd_name, function_ptr); } } [...]IRC.h
#include <stdio.h> #include <stdarg.h> #define __CPIRC_VERSION__ 0.1 #define __IRC_DEBUG__ 1 #define IRC_USER_VOICE 1 #define IRC_USER_HALFOP 2 #define IRC_USER_OP 4 struct irc_reply_data { char* nick; char* ident; char* host; char* target; }; struct irc_command_hook { char* irc_command; int (*function)(char*, irc_reply_data*, void*); irc_command_hook* next; }; struct channel_user { char* nick; char* channel; char flags; channel_user* next; }; class IRC { public: IRC(); ~IRC(); int start(char* server, int port, char* nick, char* user, char* name, char* pass); void disconnect(); int privmsg(char* target, char* message); int privmsg(char* fmt, ...); int notice(char* target, char* message); int notice(char* fmt, ...); int join(char* channel); int part(char* channel); int kick(char* channel, char* nick); int kick(char* channel, char* nick, char* message); int mode(char* modes); int mode(char* channel, char* modes, char* targets); int nick(char* newnick); int quit(char* quit_message); int raw(char* data); void hook_irc_command(char* cmd_name, int (*function_ptr)(char*, irc_reply_data*, void*)); int message_loop(); int is_op(char* channel, char* nick); int is_voice(char* channel, char* nick); char* current_nick(); private: void call_hook(char* irc_command, char*params, irc_reply_data* hostd); /*void call_the_hook(irc_command_hook* hook, char* irc_command, char*params, irc_host_data* hostd);*/ void parse_irc_reply(char* data); void split_to_replies(char* data); void insert_irc_command_hook(irc_command_hook* hook, char* cmd_name, int (*function_ptr)(char*, irc_reply_data*, void*)); void delete_irc_command_hook(irc_command_hook* cmd_hook); int irc_socket; bool connected; bool sentnick; bool sentpass; bool sentuser; char* cur_nick; FILE* dataout; FILE* datain; channel_user* chan_users; irc_command_hook* hooks; };
-
du brauchst boost::function und boost::bind aus der boost library
-
Wenn die Funktionen nicht die Absicht haben, die übergebenen Strings zu ändern, sollten sie das auch dazusagen und einen 'const char*' (oder noch besser 'const string&' entgegennehmen.
Außerdem kannst du an einen normalen Funktionszeiger keine Klassenmethode übergeben (das scheitert an einem fehlenden this-Zeiger), sondern nur globale Funktionen oder statische Methoden.
PS: Wieso legst du in der IRCBot::connectIRC() eigentlich ein neues Objekt an? Du hast doch schon eins (namens *this). Und dein Objekt 'conn' wird am Ende der Methode wieder gelöscht und vergisst die ganzen Callback-Funktionen wieder.
-
Sorry, das war noch etwas ungeschickt. Sind halt erst dabei, uns in die neue Sprache einzuarbeiten.
Das Ganze wurde jetzt nochmal umgeschrieben, so dass der Code etwas durchsichtiger und besser strukturiert ist. Jetzt klappt es auch - erstmal.
Danke für die Antworten!
