Klassenfunktion aufrufen ohne Objekt zu erzeugen.



  • Hallo Leute,

    ich habe mal eine Frage zu Klassen. Kann ich Klassenfunktion aufrufen ohne ein Objekt zu erzeugen?

    Beispiel:

    class myLogger
    {
    public:
        myLogger() {};
        ~myLogger() {};
    
        int log(std::string msg)
        {
            std::cout << msg << std::endl;
        }
    };
    
    int main()
    {
        // Variante 1
        myLogger myLog;
        myLog.log("eine Nachricht");
    
        // Variante 2
        {
            myLogger myLog;
            myLog.log("eine Nachricht");
        }
    
        // Variante 3
        myLogger().log("eine Nachricht");
    }
    

    Bisher verfahre ich wie in Variante 1. Nun wollte ich einige Optimierungen vornehmen und dies etwas vereinfachen. Kann ich dies wie in Variante 3 tun oder kann es zu Problemen führen? Wenn ich das richtig verstehe, wird ein Objekt erzeugt, die Funktion wird aufgerufen und anschließend wird das Objekt wieder zerstört (ähnlich wie in Variante 2).

    Spricht etwas dagegen? Findet ihr sowas unübersichtlich?

    viele Grüße,
    SBond



  • Kann man so machen, aber warum keine static Memberfunktion oder warum überhaupt eine Klasse? Wenn die Klasse keine Membervariablen hat kann man auch einfach eine normale Funktion nehmen und wenn sie doch Member hat will man sie wohl nicht für jede Nachricht neu erstellen.



  • die Klasse wird dann statische Variablen beinhalten. Hier habe ich das nur sehr vereinfacht 😃



  • Warum nicht gleich eine globales Loggerobjekt?



  • Daran habe ich auch schon gedacht, aber bietet es bestimmte Vorteile?

    Ich weiß nicht warum, aber ich mag es irgendwie nicht, in meinen Klassen auf irgendwelche globalen Variablen/Objekte zuzugreifen.
    ...dass fühlt sich irgendwie falsch an 😕



  • Was "Optimierungen" angeht: Man darf davon ausgehen, dass heutige Compiler bei allen 3 Varianten wie auch bei einer Lösung mit einer statischen Methode ziemlich exakt den selben Code erzeugen.
    Ich würde diejenige Variante wählen, die möglichst übersichtlich und einfach zu handhaben ist.

    Vielleicht als Inspiration: Als ih das letzte mal so etwas umgesetzt habe, sah das ungefähr so aus (Logger implementiert ein ostream-artiges Interface):

    std::unique_ptr<Logger> current_logger = std::make_unique<myLogger>();
    
    Logger& log()
    {
       assert(current_logger.get() != nullptr);
       return *current_logger;
    }
    
    int main()
    {
       log() << "Nachricht" << std::endl;
    }
    

    Gruss,
    Finnegan



  • SBond schrieb:

    Ich weiß nicht warum, aber ich mag es irgendwie nicht, in meinen Klassen auf irgendwelche globalen Variablen/Objekte zuzugreifen.
    ...dass fühlt sich irgendwie falsch an 😕

    Globale Variablen sind nicht immer böse, nur wenn es keinen guten Grund dafür gibt.
    Bei dem std::cout zierst du dich in deinem Logger doch auch nicht so 😃 ... das ist auch ein globales Objekt.

    Finnegan



  • haha ja scheint so 😃

    danke für die Tipps 😉


Anmelden zum Antworten