OVH Cloud OVH Cloud

Définir une classe log et l'utiliser comme cerr

32 réponses
Avatar
Cornu Nicolas
Bonjour,

J'aimerais définir une classe log
et l'utiliser comme cerr.

log << "erreur";

J'ai éssayer plusieurs surcharge de l'opérateur <<
en définissant à l'extèrieur de la classe log une surcharge
sans succès


Merci d'avance,

Cornu Nicolas

10 réponses

1 2 3 4
Avatar
Fabien LE LEZ
On Sun, 10 Apr 2005 10:15:27 +0200, "Cornu Nicolas"
:

J'aimerais définir une classe log
et l'utiliser comme cerr.

log << "erreur";


class Log
{
public:
template <typename T> Log& operator << (T const& t)
{
//...
return *this;
}
};


--
;-)

Avatar
Cornu Nicolas
class Logger : public ILogger
{
public:
Logger();
~Logger();
void write(std::string);
template <typename T> Logger& operator << (T const& t) { return *this; };
};
----------------------------------------------------------------------------
-----
#include "logger.h"
int main(int argc, char *argv[])
{
ILogger *log = new Logger();
log->write("132");
log << "123";
std::string s;
std::cin >> s;
return EXIT_SUCCESS;
}
----------------------------------------------------------------------------
-----
main.cpp(31): error C2296: '<<' : non conforme, l'opérande gauche est du
type 'ILogger *'
main.cpp(31): error C2297: '<<' : non conforme, l'opérande droit est du type
'const char [4]'

D'avance merci,


"Fabien LE LEZ" a écrit dans le message de
news:
On Sun, 10 Apr 2005 10:15:27 +0200, "Cornu Nicolas"
:

J'aimerais définir une classe log
et l'utiliser comme cerr.

log << "erreur";


class Log
{
public:
template <typename T> Log& operator << (T const& t)
{
//...
return *this;
}
};


--
;-)



Avatar
Fabien LE LEZ
On Sun, 10 Apr 2005 16:27:18 +0200, "Cornu Nicolas"
:

int main(int argc, char *argv[])
{
ILogger *log = new Logger();


Tu te crois en Java ?

ILogger log;

log << "123";


Ben oui, dans ton code "log" est un pointeur, pas un objet.


--
;-)

Avatar
Cornu Nicolas
J'ai besoin de créer une classe virtuelle pure.

class ILogger {
public:
ILogger();
virtual ~ILogger() = 0;
virtual void write(std::string) = 0;
virtual template <typename T> Logger& operator << (T const& t) = 0;
};

NC
"Fabien LE LEZ" a écrit dans le message de
news:
On Sun, 10 Apr 2005 16:27:18 +0200, "Cornu Nicolas"
:

int main(int argc, char *argv[])
{
ILogger *log = new Logger();


Tu te crois en Java ?

ILogger log;

log << "123";


Ben oui, dans ton code "log" est un pointeur, pas un objet.


--
;-)



Avatar
Fabien LE LEZ
On Sun, 10 Apr 2005 16:27:18 +0200, "Cornu Nicolas"
:

int main(int argc, char *argv[])
{
ILogger *log = new Logger();
log->write("132");
log << "123";
std::string s;
std::cin >> s;
return EXIT_SUCCESS;
}


Note que le code ci-dessus est totalement incorrect, puisque "log" est
créé par new et jamais détruit.


--
;-)

Avatar
Fabien LE LEZ
On Sun, 10 Apr 2005 17:09:44 +0200, "Cornu Nicolas"
:

Note : inutile de recopier mon message, surtout après ton propre
message.
D'une manière générale, tu peux virer toute ligne de citation qui se
trouve après la dernière ligne que tu tapes.
Cf <http://www.giromini.org/usenet-fr/repondre.html>.

J'ai besoin de créer une classe virtuelle pure.


Et ?

Si j'ai bien compris, ILogger (encore un Java-isme, ce nom :-/ ) est
une classe de base, non instanciable, et Logger est une classe
instanciable dérivée de ILogger.

Dans ce cas, un code correct et représentatif serait :

void f (ILogger& log)
{
log << "Hello world!" << endl;
}

int main()
{
Logger mon_logger;
f (mon_logger);
}

Mais normalement, on ferait dériver Logger (ou ILogger) de ostream,
pour pouvoir écrire :

void f (ostream& log)
{
log << "Hello world!" << endl;
}

int main()
{
Logger mon_logger;
f (mon_logger);

f (cout);
f (cerr);
}



--
;-)

Avatar
Cornu Nicolas
on peut pas fair sans passer par la fonction f ?
Avatar
Cornu Nicolas
Le probleme vient de virtual template ...
Je ne sais pas comment declaré la surcharge d el'operateur au niveau de la
clase virtuelle ILogger

Je ne suis pas un adepte de Java mais plutot de .NET
Je préfère suffixer mes interface avec un I :)
Avatar
Vincent Lascaux
class Logger : public ILogger
{
public:
Logger();
~Logger();
void write(std::string);
template <typename T> Logger& operator << (T const& t) { return *this; };
};


Le template devrait être dans ILogger

class ILogger
{
public:
virtual ~ILogger() { }
virtual void write(const std::string& s)=0;
template<typename T>
ILogger& operator << (const T& t)
{
std::stringstream ss;
ss << t;
write(ss.str());
}
};

----------------------------------------------------------------------------
-----
#include "logger.h"
int main(int argc, char *argv[])
{
ILogger *log = new Logger();
log->write("132");
log << "123";


*log << "123";

--
Vincent

Avatar
Cornu Nicolas
J'ai beosin de redefinir la fonction dans les classe filles de ILogger
je prévoit de faire un FileLogger, DatabaseLogger ...

Nico

"Vincent Lascaux" a écrit dans le message de
news:42594c3a$0$6815$
class Logger : public ILogger
{
public:
Logger();
~Logger();
void write(std::string);
template <typename T> Logger& operator << (T const& t) { return
*this; };


};


Le template devrait être dans ILogger

class ILogger
{
public:
virtual ~ILogger() { }
virtual void write(const std::string& s)=0;
template<typename T>
ILogger& operator << (const T& t)
{
std::stringstream ss;
ss << t;
write(ss.str());
}
};


--------------------------------------------------------------------------
--

-----
#include "logger.h"
int main(int argc, char *argv[])
{
ILogger *log = new Logger();
log->write("132");
log << "123";


*log << "123";

--
Vincent





1 2 3 4