【问题标题】:Overload << and >> to work well with pointers C++重载 << 和 >> 以与指针 C++ 一起工作
【发布时间】:2013-11-24 19:32:46
【问题描述】:

我正在尝试添加这些功能:

friend std::ostream& operator <<( std::ostream& outs, const TrashCan * drive );
friend std::istream& operator >>( std::istream& ins, TrashCan * & drive );

所以它在 main 中与这个驱动程序代码一起正常工作:

#include <iostream>
#include <stdexcept>
#include "TrashCan.h"


int main( ) {

using namespace std;

cout << "Welcome to my TrashCan Program!" << endl;

TrashCan myCan;
TrashCan yourCan;
TrashCan empty( 0, 0 );
TrashCan * ptrCan = new TrashCan( 0, 0 ); 
TrashCan * nullCan = NULL; 

// using overloaded operations for pointers...
cin >> ptrCan;
cin >> nullCan;  // 

cout << ptrCan << endl;
cout << nullCan << endl;  //

我的垃圾箱类构造函数是这样的:

TrashCan( int size, int contents );

我熟悉重载 + - 和 ≤ 等简单操作,但在重载 iostream 函数以使其与指针一起工作时,我感到很困惑。有什么想法吗?

【问题讨论】:

  • 最终目标是提供一种将这些对象序列化到磁盘或从磁盘序列化的方法吗?
  • 我对您的实际问题有点困惑。这个程序可以编译吗?如果不是,错误信息是什么?还是您在询问最佳做法?

标签: c++ pointers operator-overloading


【解决方案1】:

我个人认为重载TrashCan 对象更有意义,然后在需要打印对象的位置取消引用指针。

在不太了解你的问题的情况下,我建议你只需要一个签名。

// Take const reference, not pointer
friend std::ostream& operator <<( std::ostream& outs, const TrashCan& drive );


TrashCan * ptrCan = new TrashCan( 0, 0 ); 
// [...]
std::cout << *ptrCan << endl;    // dereference.  no copies made.

拥有一个函数定义的另一个好处是代码更易于维护,即您不会有需要并行维护或重构以使用相同代码的函数的两个重载。

【讨论】:

    【解决方案2】:

    虽然可以只重载指针的输入和输出操作符,但我一开始并不认为这是一个好主意:在 C++ 中几乎不需要使用指针,而且没有任何意义鼓励用户使用运营商。也就是说,简单的解决方案是:不要使用指针!

    从概念上讲,与其他类型相比,为指针重载输入或输出运算符并没有什么不同。也就是说,你只会超载

    std::ostream& operator<< (std::ostream& out, TrashCan const* drive) {
        return *drive;
    }
    std::istream& operator>> (std::istream& in, TrashCan* drive) {
        return *drive;
    }
    

    这两种实现都只是委托给相应的参考版本,将问题简化为已知解决方案的问题(I/O 与对象的引用)。

    【讨论】:

    • @DyP:用于内置类型(包括指针)的 ADL 不会去寻找有趣的地方。在部分中,它不会在定义了指向类的类型的命名空间中查找(如果我没记错的话)。关于实际上是不允许的:第 17 章中限制了哪些内容可以在不涉及用户定义类型的情况下进行重载,并且由于指针算作内置类型,因此这些重载不涉及任何用户定义类型。
    • @DyP:很有趣。根据此子句,指针应有助于搜索的名称空间集。我不知道为什么我得出的结论是他们不会。我也找不到对重载的任何限制。看来,我需要修改我的答案(尽管我会坚持使用指针并不是一个好主意)。
    【解决方案3】:

    您不应该为指针重载运算符。您应该传递一个对象或对该对象的引用。

    他们应该这样声明:

    std::ostream& operator <<(std::ostream& out, const TrashCan & drive );
    std::istream& operator >>(std::istream& in, TrashCan  & drive );
    

    【讨论】:

      猜你喜欢
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2012-09-25
      • 2021-01-07
      • 2021-07-02
      • 1970-01-01
      相关资源
      最近更新 更多