Function returns Function... kann man sich dagegen wehren?



  • Aus irgendeinem Grund unterstellt mir g++, dass ich mit static Log* getLog(); eine Funktion deklariere, die eine Funktion zurückgibt. Wisst ihr warum?

    #ifndef LOG_H_
    #define LOG_H_

    #include <string>
    #include <fstream>

    #define getLog Log::getLog()
    #define DEFAULT_FL __file__, __line__

    using namespace std;

    class Log {
    private:

    Log(const char*);
    Log(Log&);
    virtual ~Log();

    static Log* m_plog;
    ofstream* m_plogfile;

    static const short newline_char;
    static const char* newline;

    public:

    static void destroy();
    static Log* getLog(); //<---- HIER IST DER FEHLER

    typedef int logLevel_t;
    enum {DETAIL, WARNING, ERROR, CRITICAL};
    void write(logLevel_t, string&, unsigned, const char*);

    };

    #endif /*LOG_H_*/



  • Könntet ihr auch bitte schreiben, wenn ihr keine Antwort kennt? Dann würde ich das als Bug reporten. Danke 🙂

    (Sorry wegen dem Doppelpost)



  • Das liegt an deinem define. Nach dem Präprozessor sieht die Funktionsdeklaration nämlich so aus:

    static Log* Log::getLog()();
    

    Der Sinn deines defines erschließt sich mir allerdings nicht ganz.



  • Ach natürlich!!! 😮 Danke =)... tut mir leid, irgendwie sieht man selber sowas nicht... 🙄
    Ich wollte mir damit das lästige Log::getLog() ersparen und einfach nur noch getLog-> schreiben müssen... aber in Zukunft: Finger weg von defines wenn es nicht 100%ig Sinn macht 🙄 🙂



  • Du kannst ja getLog außerhalb von der Klasse definieren und zum Freund der Klasse machen.



  • Also wenn du class das singleton machst, as ist sinnvol, zeitweilig Variable zu erklaren:

    Log* log = Log::getLog();
    log->someMethod();
    log->otherMethod();
    

    Wenn class ist wesentlich statish ist, erklarst alle Functionen als statish, aber solchen Entscheidungen voll durchgedacht sind mussen.



  • Ne, man erklärt nur die Funktionen als statisch die man auch ohne Objekt ansprechen möchte. Alle anderen kann man ruhig "normal" deklarieren.
    Ich habe das Makro jetzt in LogInstance umbenannt 🙂
    Ja, speichern sollte man sie 🙂



  • Entschuldigung für den Doppelpost... aber ich bin gerade aus Versehen auf Absenden gekommen 😞 (-.- solangsam wirds ziemlich peinlich hm ? 🤡 🙄 )
    Danke für eure Antworten und das auch noch so fix 🙂


Anmelden zum Antworten