重载<< operator C ++ - 指向类的指针

时间:2009-03-09 13:21:10

标签: c++ pointers operator-overloading

class logger {
 ....
};

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

logger log;
log << "Lexicon Starting";

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

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

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

编辑:编译器错误是

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

5 个答案:

答案 0 :(得分:11)

你必须取消引用你的记录器对象的指针,并明显检查它是否不是0.这样的事情应该做的工作:


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

作为一般情况下,由于你用指针得到的不确定性,我会回避引用像记录器这样的对象(你通常无条件地期望它存在),因为AKA是否有一个对象? / p>

答案 1 :(得分:9)

这是方法:

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

答案 2 :(得分:5)

为什么不使用参考?

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

log << "Lexicon Starting";

如果这不是您想要的,我会选择Timo Geusch,即使它很难看

答案 3 :(得分:2)

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

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

Logger& log = logger();
log << "...";

答案 4 :(得分:2)

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

decasteljau正确地指出,如果你想要指针,可以通过(*log)执行此操作。但是,我不喜欢指针。 Andrei Alexandrescu在“现代C ++设计”中专注于智能记录器单例,可能值得参考。