Eigenen Logger mit Ableitbaren Klassen für Dateien und Konsole



  • Guten Abend liebe Leute im Forum,

    Ich würde gerne ein Array (in welcher Form auch immer) haben,
    dass einen Pointer auf einen Logger (selbstgeschrieben) hat.

    Das ist ja noch kein Problem, aber ich würde dort gerne verschiedene
    Logger speichern, die z.B. in eine Datei oder Konsole schreiben.

    Nun zu meinen Problem:

    Wie stelle ich das am besten an, dass ich eine Basisklasse habe,
    die im Prinzip noch kein bestimmten Stream hat und sich Ableiten lässt.

    In den Abgeleiteten Klassen würde ich einfach ein std::ostream und ein
    std::fstream benutzen, nur kann ich da nicht Allgemeine Funktionen schreiben,
    weil die Basisklasse ja keinen Stream hat ...

    class Logger
    {
        void Write(const std::string& text)
        {
            // hier hab ich ja noch keinen Stream
        }
    
        template<class T> Logger operator<<(T& t)
        {
            // return stream << t;
            // geht ja nicht, weil ich keinen Stream in Logger habe
        }
    };
    
    class ConsoleLogger : Logger
    {
    private:
        std::ostream& stream;
    };
    
    class FileLogger : Logger
    {
    private:
        std::ofstream stream;
    }
    
    std::vector<Logger*> logger;
    logger.push_back(new Logger());
    logger.push_back(new ConsoleLogger());
    logger.push_back(new FileLogger());
    

    Ich würde halt jetzt gerne in Logger alle Funktionen definieren
    und für die Abgeleiteten nutzen.

    Vielen Dank für's Durchlesen, ich hoffe es ist alles verständlich

    Gruß
    Simon



  • Für solche Probleme wurden virtuelle (bzw pur virtuelle) Methoden erfunden - die Basisklasse liefert nur die abstrakten Methoden deklariert und die abgeleiteten Klassen liefern die konkrete Umsetzung.

    Für dich könnte es sogar ausreichen, wenn du eine Methode ostream& getStream()=0; definierst und in den Logger-Methoden verwendest.


Anmelden zum Antworten