Klassenzugriff



  • Hi,

    noch mal eine Frage von mir bezüglich zugriff auf Klassen, dass ich noch nicht verstehe.

    Folgenes Beispiel:

    Klasse "Utils" öffnet im Konstruktor eine Datei und stellt die Methode "Log" zur verfügung in der ein als Parameter übergebener String in die offene Datei gespeichert wird.

    Klasse "A" tut nun was und ruft die Methode "Utils::Log" auf, um etwas in die Datei zu speichern.

    Nun ist Klasse "B" an der Reihe und möcht auch was in die Datei speichern. Also Objekt "Utils" erstellt und Methode "Log" aufgerufen.

    AAAAber, jetzt wird die Datei ja wieder geöffnet. Wäre doch viel besser, wenn die Datei immer offen wäre, dafür müsste ich aber - nach meinem momentanen Wissen - die Datei nicht im Konstruktor öffnen, sondern in einer weiteren Methode "open", diese dann von Klasse "A" aufrufen, und den Dateihandle an Klasse "B" weitergeben, der damit die Methode "Log" aufruft und so weiter.

    Das kanns ja auch nicht sein.

    Jemand eine Idee, wie das am glücklichsten zu bewerkstelligen ist?

    Grüße euch
    Maddes



  • Was genau hast du vor? Wenn jeder Anwender eine eigene Log-Datei benötigt, klappt der Ansatz mit dem Konstruktor eigentlich ganz gut. Wenn alle Anwender in die selbe Datei loggen sollen, könntest du ein statisches Element verwenden, das als Ziel dient (öffnen müsstest du die Datei in einer eigenen open()-Methode oder beim ersten Aufruf von log()).



  • statisches Element

    das Isses 🙂

    Danke für den Tipp, habs noch mal nachgelesen und ich denke - das ist genau das was ich suche 🙂



  • okay, noch was:

    ich habe jetzt versucht, die Methode "log" zu ersetzen und den Operator "<<" zu überladen, also damit folgenes möglich ist:

    class Log 
    {
       ...
    }
    
    Log log;
    
    log << "bla bla";
    

    aber ich bekomms nicht hin. Geht das überhaupt?

    Grüße



  • Die einfachste Möglichkeit wäre es wohl, log von std::ostream abzuleiten, dann bekommst du den op<< gratis mitgeliefert für alles, was ausgegeben werden kann (allerdings kannst du nur schwer dazwischengreifen).

    Alternativ wäre auch sowas vorstellbar:

    class log
    {
      static ofstream logfile;
      string name;
    public:
      log(const string&n) : name(n) {}
      template<typename T>
      log& operator<<(const T& val)
      {
        if(!logfile.isopen()) logfile.open("Log.txt");
        logfile<<name<<": "<<val<<endl;
        return *this;
      }
    };
    


  • hey, danke!

    Super Code, funktioniert auch, bis auf das static: (liegt sicher nicht an deinem Code sondern an mir 😕 )

    #include <iostream>
    #include <string>
    #include <fstream>
    
    ofstream log::logfile;
    
    using namespace std;
    
    class log
    {
    	static ofstream logfile;
    	string name;
    
    	public:
    		log(const string&n) : name(n) {}
    	  	template<typename T>
    	  	log& operator<<(const T& val)
    	  	{
    			if(!logfile.is_open()) logfile.open("Log.txt");
    	    	logfile << name << ": " << val << endl;
    	    	return *this;
    	  	}
    };
    
    int main() {
    
    	log log("test");
    	log << "hallo";
    
    }
    

    log.cpp:6: Fehler: »ofstream« bezeichnet keinen Typ



  • Das ist alles eine Frage der Reihenfolge - die Zeile 6 gehört HINTER deine Klassendefinition, dann klappt's auch mit dem Compiler.



  • ...........................

    sag mir wann ich wieder aus der Ecke darf.... 🙄

    1000 Dank! So hab ichs mir vorgestellt 🙂



  • Maddes schrieb:

    sag mir wann ich wieder aus der Ecke darf.... 🙄

    Wenn du dich in die Ecke verkriechst, bringt das auch niemandem etwas. Schreib einfach 100 mal "ich darf Namen erst verwenden, nachdem sie deklariert wurden" 😃



  • soa, ich glaub ich werd bekloppt.

    also, lokaler Laptop - gcc-Version 4.1.2 20061027: Alles Super! 👍

    Server mit gcc version 3.3.5 (Debian 1:3.3.5-13): Fehler! 👎

    log.cpp: In function int main()': log.cpp:30: error: parse error before(' token
    log.cpp:31: error: invalid operands of types <unknown type>' andconst
    char[6]' to binary `operator<<'

    Beides male der selbe Code !! 😞



  • Die Klasse und die Instanz sollten unterschiedliche Namen haben (nicht beidesmal 'log').


Anmelden zum Antworten