【问题标题】:Overloading << operator C++ - Pointer to Class重载 << 运算符 C++ - 指向类的指针
【发布时间】:2009-03-09 13:21:09
【问题描述】:
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<<'

【问题讨论】:

    标签: c++ pointers operator-overloading


    【解决方案1】:

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

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

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

    【讨论】:

    • 同意。在程序初始化期间创建记录器,然后提供一种获取引用而不是指向它的指针的方法。或者,使用 std::cerr 作为您的记录器,重新打开它以指向一个文件(尽管这需要一些工作,因为它有点 hacky :))
    • 哦,请确保您使用正确的括号。 log && ((*log)
    【解决方案2】:

    方法如下:

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

    【讨论】:

      【解决方案3】:

      为什么不使用参考?

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

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

      【讨论】:

        【解决方案4】:

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

        ...
        Logger& logger() {
            return *_pLogger;
        }
        ...
        
        Logger& log = logger();
        log << "...";
        

        【讨论】:

        • 他为什么要这样做?
        • 在我看来,他从某个类结构中获取了他的记录器实例,在这种结构中,返回引用可能比指向内部记录器实现的指针更有用。正如我所说:'取决于上下文'。
        【解决方案5】:

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

        decasteljau 正确地指出,如果您需要指针,您可以通过(*log) 执行此操作。但是,我不喜欢指针。 Andrei Alexandrescu 在“现代 C++ 设计”中花了很多篇幅介绍智能记录器单例,可能值得参考。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-09
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多