Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Geht das so io?

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
13.05.2007, 16:42 Uhr
xXx
Devil


Also ... hab mir nen kleines Message-System aufgebaut:

C++:
class GUI_API Window
{
    typedef bool (Window::* MessageHandler)(std::size_t*, void*);

protected:
    void                        register_message(const std::size_t&, MessageHandler);

public:    
    bool                        handle_message(const std::size_t&, std::size_t* param1 = NULL, void* param2 = NULL);

protected:
#pragma warning (disable: 4251)
    std::map<std::size_t, MessageHandler>    m_messages;
#pragma warning (default: 4251)
};
...

C++:
void Window::register_message(const std::size_t& message_id, MessageHandler message_handler)
{
    m_messages.insert(std::make_pair(message_id, message_handler));
}

bool Window::handle_message(const std::size_t& message_id, std::size_t* message_param1, void* message_param2)
{
    std::map<std::size_t, MessageHandler>::iterator    it    = m_messages.find(message_id);
        
    if (it == m_messages.end())
        return true;
        
    return (this->*((*it).second))(message_param1, message_param2);
}
... soweit verständlich? Ich hab ne Funktion register_message ... damit kann ich Funktionen einer von Window abgeleiteten Klasse in die map packen ...
handle_message ruft die funktion dann auf ... wobei ich da jetzt den this-Zeiger genutzt hab. Ist das so io? Was passiert wenn die Memberfunc die in der map ist nicht eine memberfunc der selben klasse ist wie der this-Zeiger?

aja der aufruf von register_message sähe so aus:

C++:
register_message(gui::GWM_ON_SEL_CHANGE, static_cast<MessageHandler>(&WindowBookSelection::on_sel_change));
...

Was würdet ihr an dem System verändern?
Danke ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.05.2007, 16:44 Uhr
xXx
Devil


achja ... hab das in nem Projekt von mir getestet und es Funktioniert ... aber ist das ne gute Methode? Was würdet ihr ändern (wenn überhaupt ..) ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.05.2007, 12:00 Uhr
Th




Zitat:

Was passiert wenn die Memberfunc die in der map ist nicht eine memberfunc der selben klasse ist wie der this-Zeiger?


Dann macht es bumm... (zumindestens wenn in der registrierten Methode auf Member der abgeleiteten Klasse zugegriffen wird)

Meines Erachtens sollte handle_message eine statische Methode, welche dann als Parameter ein Window erhält.
So mußt du sicherstellen, daß du immer handle_message für das richtige Window aufrufst und das ist dann etwas fehleranfällig.

P.S. Warum ist dein erster Message-Parameter ein Zeiger (std::size_t* param1)?

Dieser Post wurde am 14.05.2007 um 12:02 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.05.2007, 12:55 Uhr
xXx
Devil


hmm ok ... nja ich kann natürlich auch hingehen und

C++:
template<class T>
class GUI_API Window
{
    typedef bool (T::* MessageHandler)(std::size_t*, void*);

protected:
    void                        register_message(const std::size_t&, MessageHandler);

public:    
    bool                        handle_message(const std::size_t&, std::size_t* param1 = NULL, void* param2 = NULL);

protected:
#pragma warning (disable: 4251)
    std::map<std::size_t, MessageHandler>    m_messages;
#pragma warning (default: 4251)
};
daraus machen ... wenn jemand dann wild rumcastet um auf diesen Typen zu kommen ... ist er ja selber schuld wenn es knallt ... kann man es noch anders verhindern?


Zitat:
P.S. Warum ist dein erster Message-Parameter ein Zeiger (std::size_t* param1)?
Hmm ist für mich ganz praktisch da nen Großteil der Variablen dieser GUI-Lib std::size_t sind ... dann brauch ich nicht rumcasten usw.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.05.2007, 13:13 Uhr
0xdeadbeef
Gott
(Operator)


Anstatt das Rad neu zu erfinden, würd ich mal nen Blick auf libsigc++ werfen Die macht das ganze deutlich einfacher.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.05.2007, 13:25 Uhr
xXx
Devil


Joa sieht rel. interessant aus Ich hab mir die ganzen Lizenzen noch nie angeguckt (da ich normal alles selber schreibe ^^) ... in wie weit kann ich die Software am ende kommerziell verkaufen, wenn ich diese lib nutze? Steht ja under GPL 2 ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.05.2007, 13:49 Uhr
0xdeadbeef
Gott
(Operator)


Steht unter LGPL. Das heißt, du kannst sie in deinen Programmen benutzen und sie trotzdem nachher noch verkaufen (musst allerdings nen Hinweis auf libsigc++ mitliefern). Wenn du an der Bibliothek selbst was änderst, muss die Änderung freigegeben werden.
--
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: