Singleton und operator



  • Hi,

    ich habe folgendes problem:

    Ich hab einen Singleton einer klasse und diese klasse hat halt nen << operator. Doch beim Compilieren bekomm ich folgenden Error:

    error C2296: '<<' : illegal, left operand has type 'class CLog *'
    error C2297: '<<' : illegal, right operand has type 'char [5]'
    

    Hier der Code:

    // CLog.h
    class CLog 
    { 
    public: 
        static CLog      *getInstance   (void) { return (&m_Instance); }
    
        void setFile (const char *FileName = "Protokoll.htm");
    
        CLog& operator<< (void* n); 
    
    private: 
        CLog (void); 
    
        static  CLog    m_Instance;
    
        std::ofstream   m_Stream; 
    };
    

    die cpp:

    #include "CLog.h"
    
    CLog CLog::m_Instance;
    
    CLog::CLog(void) 
    { 
    } 
    
    CLog& CLog::operator<< ( void* n ) 
    {    
        this->m_Stream << n; 
    
        return (*this); 
    }
    

    und hier die main.cpp:

    #include "CLog.h"
    
    int main (void)
    {
        CLog            *p_Protokoll;
        p_Protokoll     = CLog::getInstance ();
    
        p_Protokoll << "Test" << std::endl;
    
        return(false);
    }
    

    muss ich den Singleton umbauen oder wie bekomm ich die << operatoren ans laufen dabei? 😕

    [ Dieser Beitrag wurde am 29.03.2003 um 00:23 Uhr von Blue Angel editiert. ]



  • in den du mit refernzen arbeitest oder den pointer dereferenzierst

    int main (void)
    {
        CLog            *p_Protokoll;
        p_Protokoll     = CLog::getInstance ();
    
        *p_Protokoll << "Test" << std::endl;
    
        return(false);
    }
    

    ahja

    CLog            *p_Protokoll;
        p_Protokoll     = CLog::getInstance ();
    

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Init#Answ
    diese regel tut zwar bei buldins nicht gelten, der link ist vorbeugend

    false wird zu 1 convertiert und zurück gegeben, bei den rückgabe wert von main bedeutet aber alles ander als 0 ein fehler



  • ahja wie bekomms du std::endl in dein CLog stream?



  • Danke für die Info. werds auf der stelle Ändern, achja, das mit dem Pointer ist ja gut, aber gibbet keine "elegantere" Lösung?

    Denn das hier schreiben ist extrem unschön am Anfang:

    *p_Protokoll << "Test" << "test2";
    

    Gibt es denn die Möglichkeit das ca. so hinzukriegen:

    Protokoll << "Test" << "Test2";
    


  • Sicher!
    CLog &Protokoll = *CLog::getInstance();

    Protokoll << "muhkuh";



  • CLog & Protokoll = *CLog::getInstance();
    

    dann würde ich auch noch den rückgabe typ von getInstanz von pointer zu referenz umändern



  • @Dimah & <doch>
    Hm also ich hab jetzt die getInstance zu ner Referenz gemacht, doch es gibt da trotzdem errors.

    static CLog      &getInstance   (void) { return (m_Instance); }
    

    und ich bekomme bei der Zeile hier:

    CLog &Protokoll = *CLog::getInstance();
    

    diesen Error:

    error C2100: illegal indirection
    


  • Wenn du ne Referenz zurückgibst brauchst nicht mehr zu dereferenzieren (das * weglassen)



  • tschuldigung aber dein operator<< ist der größte Müll. Schau dich mal n bischen in STL Quellcode um oder nimm das nächst beste Buch zur Hand.



  • Original erstellt von Lars:
    Wenn du ne Referenz zurückgibst brauchst nicht mehr zu dereferenzieren (das * weglassen)

    Hi,

    wenn ich das hier schreibe:

    CLog &Protokoll = *CLog::getInstance();
    

    schmiert das programm ab



  • Original erstellt von Blue Angel:
    **Hi,

    wenn ich das hier schreibe:

    CLog &Protokoll = *CLog::getInstance();
    

    schmiert das programm ab**

    Ja, weil du dereferenzierst. Du sollst das * weglassen



  • wenn ich es weglasse compiliert er fehlerfrei, aber bei ausführen einer funktion schmiert er ab



  • dann finde heraus, wo es passiert



  • habs hinbekommen, thx für die hilfe 🙂

    @Lars:
    wie hättest du den operator<< denn gemacht? 😕

    [ Dieser Beitrag wurde am 29.03.2003 um 10:32 Uhr von Blue Angel editiert. ]



  • template<class T>
    CLog& operator<<(T& t)
    {
    m_Stream << t;
    }
    Deiner dürfte noch nichtmal funktionieren



  • Achja deiner schmiert ja deswegen auch ab.
    Wie kommst du überhaupt auf void* 😕 😕 😕 😕
    /€dit: Wieso wurde ich auf Seite 2 weitergeleitet die es gar nicht gibt.
    Das bezieht sich auf den letzten Post.

    [ Dieser Beitrag wurde am 29.03.2003 um 10:35 Uhr von Lars editiert. ]



  • also so funzt er eigentlich prima! Naja das mit dem Template guck ich mir mal an. das mit void* is was ganz einfaches 😉 Adressen speichern, is zwar eigentlich nicht zu gebrauchen, aber habs einfach mal aus lust und laune reingebaut



  • Ach du willst nur die Adressen speichern?


Anmelden zum Antworten