windows - C ++ - bruger ostream i min egen klasse

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har problemer med at bruge en ostream i min logger klasse. Af en eller anden grund bliver std :: endl aldrig udskrevet, og der er ikke tilføjet noget nyt. Jeg er sikker på, at der er noget galt, jeg har problemer med at forsøge at forstå hvordan at bruge min ostream i mine klasser, så jeg har nok gjort noget fundamentalistisk forkert.


class MyStreamBuf : public std::streambuf
{
    public:
    MyStreamBuf() : std::streambuf() 
    {

    }
};

class MyLogger : public std::ostream
{
public:
    MyLogger(MyStreamBuf* buf) : std::ostream(buf) { mBuf = buf; }
    ~MyLogger() { delete mBuf; }

    template <typename T>
    inline MyLogger& operator << (T const& value)
    {
#ifdef \_WIN32 || \_WIN64
        std::cout << value;
#endif

        return *this;
    }

    inline std::ostream& operator << (std::ostream& (*f)(std::ostream&))
    {

        return f(*this);
    }

    MyStreamBuf* mBuf;
};



int \_tmain(int argc, \_TCHAR* argv[])
{
    MyStreamBuf* buf = new MyStreamBuf();
    MyLogger logger(buf);
    logger << "kekekek" << "asdf: " << 23 << std::endl;
    logger << "kekekek" << "asdf: " << 23 << std::endl;;

    getchar();
    return 0;
}


Produktion:


kekekekasdf: 23kekekekasdf: 23

Bedste reference


Prøv dette:


inline std::ostream& operator << (std::ostream& (*f)(std::ostream&))
{
        std::cout << f;
        return *this;
}

Andre referencer 1


Du har den grundlæggende tilgang lige, når du bruger en brugerdefineret stream buffer klasse. Dette er dog det sted, du vil implementere den specifikke logik i stedet for i klassen afledt af std::ostream!


Bare for at forklare, hvad der sker i øjeblikket: Når du ringer til f(*this), kaldes funktionen f() med basen std::ostream, som modtager output og får flush() kaldet. Din klasse er helt ude af billedet.


Her er hvad du skal gøre:
 * Fjern output operatørerne fra din MyLogger klasse
 * implementere overflow() i din strømbuffer for at håndtere overfyldning af dens buffer (fx send tegn et eller andet sted eller øg bufferen)
 * implementer sync() for at sende puffede tegn og gøre alt andet, du skal gøre, når strømmen er skyllet
 * sandsynligvis MyLogger bør eje strømpufferen og sætte vasen korrekt op; typisk er det en klasse der er afledt af std::ostream


Der spiste masser af eksempler på hvordan dette ser ud derude. Søg efter streambuf og James Kanze eller mig for at finde et par.

Andre referencer 2


Du skal sende endl et eller andet sted. Ved at gøre f(*this) prøver du at sende det til dig selv, men dit objekt har ikke de nødvendige metoder til at gøre det. Hvis du ser i #include <ostream>, bruger funktionen endl funktionen put til at sætte en i strømmen og derefter skylle den.


Du skal skrive endelinjen et eller andet sted. For eksempel hvis du skriver til cout så kan du gøre det


(*f)(std::cout);