Problem mit Funktionspointer auf Memberfunktion und std::Map



  • Halli hallo,

    und zwar moechte ich statt mit switch case mit dem object-switching pattern in abgespeckter Version arbeiten:

    zuerst hab ich mal das hier:

    typedef bool (CLog::*InitLogType) (void);
    	typedef void (CLog::*StopLogType) (void);
    
    	typedef std::map<LOG_TYPE, InitLogType> MapInit;
    	typedef std::map<LOG_TYPE, StopLogType> MapStop;
    
    /*-----*/
    		/* inster init functions */
    		m_InitMap.insert( std::pair<LOG_TYPE, InitLogType>(FILE, &CLog::FileLoggingInit) );
    		/* ----------- */
    		/* insert stop functions */
    		m_StopMap.insert( std::pair<LOG_TYPE, StopLogType>(FILE, &CLog::FileLoggingStop ));
    		/* --------------- */
    
    /*--------*/
    
    /* und dann so der Aufruf */
    
    		MapInit::iterator InitIter = m_InitMap.find(LogType);
    		MapStop::iterator StopIter = m_StopMap.find(m_LogType);
    
    		if(InitIter != m_InitMap.end() )
    			if ( ! (InitIter()) )
    				return false;
    
    		if( StopIter != m_StopMap.end() )
    			StopIter();
    

    Leider funktioniert das nicht und ich bekomme diese Fehlermeldung:

    error C2064: Ausdruck ergibt keine Funktion, die 0 Argumente übernimmt

    Danke schon mal fuer die hilfe
    Gruessli C0de4Fun



  • Ach ja und die Frage :): Wo ist das Problem bei diesen Aufruf, die Funktionen brauchen doch keine Parameter



  • Also, erstmal hantierst Du damit Iteratoren rum und keinen Funktionszeigern. Du musst die Iteratoren also noch dereferenzieren. Dann ist die Syntax für den Aufruf einer Elementfunktion über solche Zeiger ganz anders:

    (object.*pmf)();
    (zeiger->*pmf)();
    

    wobei pmf ein "pointer to member function", objekt ein Objekt vom Typ CLog, zeiger ein Zeiger vom Typ CLog* ist.



  • gern geschehen!



  • krümelkacker schrieb:

    Also, erstmal hantierst Du damit Iteratoren rum und keinen Funktionszeigern. Du musst die Iteratoren also noch dereferenzieren. Dann ist die Syntax für den Aufruf einer Elementfunktion über solche Zeiger ganz anders:

    (object.*pmf)();
    (zeiger->*pmf)();
    

    wobei pmf ein "pointer to member function", objekt ein Objekt vom Typ CLog, zeiger ein Zeiger vom Typ CLog* ist.

    Guten Morgen,

    hackizack des is ja ein gefrickel. Muss au ehrlich sagen da gefallt mir C iwie trotzdem besser. Auch die Fehlermeldungen sind immer so Kryptisch. [/persoenliche Meinung]

    Aber nun zum Thema. Danke dir kruemelkacker hat geklappt so wie du es beschrieben hast auch wenn ichs gestern nicht mehr hinbekommen hab. Erst heut nachdem ich noch mal einen kurzen Blick in den Primer gemacht hab (hatte ich gestern nicht bei der Hand). Habs jetzt so geschrieben:

    if(InitIter != m_InitMap.end() )
    			if ( ! (this->*(InitIter->second))() )
    				return false;
    
    		if( StopIter != m_StopMap.end() )
    			(this->*(StopIter->second)) ();
    

    Und das man das jetzt noch schoener schreiben koennte geht nicht oder!?

    a blessed day C0d34Fun



  • Du könntest dir mal boost::bind angucken, hab´s selber bisher noch nicht benutzt, könnte aber Dinge vereinfachen.



  • DocShoe schrieb:

    Du könntest dir mal boost::bind angucken, hab´s selber bisher noch nicht benutzt, könnte aber Dinge vereinfachen.

    Joa hmm...

    muss sagen da ich ja noch nicht mit allen Elementen von C++ einiger maßen sicher umgehen kann moecht ich eigentlich erst mal auf boost verzichten. Ich denk mir, das dass ungefaehr so ist als wenn man die WinAPI benutzt und C nicht richtig versteht. Da entstehen mehr Probleme und Fragen die eigentlich unnoetig sind. (wenn ich mich irre sagt bescheid). Muss au sagen mich nerven die Fragen ala: "ich programmiere seit 2 Wochen C und moechte jetzt ein Fenster erstellen geht aber ned" von Neulingen im WinAPI Bereich schon sehr arg. Und deswegen moechte ich auch boost vermeiden ;).

    still a nice day, Jah blessed it
    C0de4Fun



  • finde ich nicht

    für boost musst du nur dokumentation lesen können.
    noch dazu ist boost::bind (und boost::function) jetzt nicht das schwergewicht - aber es vereinfacht das alles halt so extrem und ist nicht zu letzt auch fehlerfrei.
    ich an deiner stelle würde es nutzen.

    hier ist die doku für bind:
    http://www.boost.org/doc/libs/1_43_0/libs/bind/bind.html
    Selbst nen Dussel, wie ich (der ganz bestimmt kein gutes englisch hat), findet da ganz schnell, was er braucht...^^

    bb



  • Allerdings ist es sicher von Vorteil, wenn man mit dem Konzept von Funktions- und Memberfunktionszeigern vertraut ist, bevor man sich an boost::function wagt.



  • Und nicht zuletzt muss der Compiler boost::bind auch unterstützen ...
    meiner (Codegear RAD Studio 2007) streckt bei Zeigern auf Member alle viere von sich 😮


Anmelden zum Antworten