4
class logger {
 ....
};

logger& operator<<(logger& log, const std::string& str)
{
    cout << "My Log: " << str << endl;
    return log;
}

logger log;
log << "Lexicon Starting";

工作正常,但我想使用指向类实例的指针。IE

logger * log = new log();
log << "Lexicon Starting";

这可能吗?如果是这样,语法是什么?谢谢

编辑:编译器错误是

error: invalid operands of types 'logger*' and 'const char [17]' to binary 'operator<<'
4

5 回答 5

12

您必须取消引用指向您的记录器对象的指针,并且显然检查它是否不是 0。这样的事情应该可以完成这项工作:


  log && ((*log) << "Lexicon starting")

总的来说,我会回避通过指针引用像记录器这样的对象(您通常无条件地希望存在),因为指针不确定,AKA 是否存在对象?

于 2009-03-09T13:24:57.373 回答
9

这是方法:

logger * log = new log();
(*log) << "Lexicon Starting";
于 2009-03-09T13:24:26.003 回答
5

为什么不使用参考?

logger & log = *(new log()); 
// the above is abhorrent code that 
// should be replaced by something meaningful

log << "Lexicon Starting";

如果这不是你想要的,我会选择Timo Geusch,即使它很丑

于 2009-03-09T13:30:14.397 回答
2

根据您获取记录器的上下文,您可能希望返回引用而不是指针:

...
Logger& logger() {
    return *_pLogger;
}
...

Logger& log = logger();
log << "...";
于 2009-03-09T13:28:59.253 回答
2

并不真地。new log( )有指针类型,"Lexicon starting"有类型const char[16]。如果至少一个参数具有用户定义的类型,则只能重载运算符。

decasteljau 正确地指出(*log),如果你想要指针,你可以通过 来做到这一点。但是,我不喜欢指针。Andrei Alexandrescu 在“现代 C++ 设计”中花了很多篇幅介绍智能记录器单例,可能值得参考。

于 2009-03-09T13:29:48.953 回答