【问题标题】:Using ostream as a reference (C++)使用 ostream 作为参考 (C++)
【发布时间】:2011-05-12 03:42:25
【问题描述】:

我有一个家庭作业,其中头文件提供给我们,并且是不可更改的。我无法弄清楚如何正确使用“显示”功能,所以这里是相关代码。

头文件:

#ifndef SET_
#define SET_

typedef int EType;

using namespace std;

#include <iostream>

class Set
{
  private:

    struct Node
    {
      EType Item;     // User data item
      Node * Succ;    // Link to the node's successor
    };

    unsigned Num;     // Number of user data items in the set
    Node * Head;      // Link to the head of the chain

  public:

    // Various functions performed on the set

    // Display the contents of the set
    //
    void display( ostream& ) const;

};

#endif

这是我对“显示”功能的实现:

void Set::display( ostream& Out ) const
{
  Node * temp = Head;
  cout << "{ ";
  while( temp != NULL )
  {
  cout << temp << ", ";
  temp = temp->Succ;
  return Out;
  }
}

这是我的司机:

#include <iostream>
#include <iomanip>
#include "/user/cse232/Projects/project08.set.h"

using namespace std;

int main()
{
  Set X;
  X.insert(10);
  X.insert(20);
  X.insert(30);
  X.insert(40);
  X.display();
}

我收到的错误表明在我的驱动程序中,我没有使用正确的参数。我理解这一点,因为 .h 文件使用 ostream& 作为参数。我的问题是,当调用“显示”作为一个好的参数时,我在驱动程序文件中使用什么?

【问题讨论】:

  • 这是一个很好的新手问题。删除了所有不相关的位,但(几乎)显示了所有相关位。下一次,只需添加确切的错误消息并指出它所指向的确切行,就完美了。

标签: c++ pass-by-reference ostream


【解决方案1】:

您没有传入 ostream 对象。改成这样:

X.display(cout);

然后在您的班级中将所有出现的 cout 替换为 Out。 此外,显示函数应该返回一个 const ostream & 而不是 void。您还应该使用 const ostream 引用而不是 ostream。

在类外使用运算符是标准的:

const ostream & operator<< (const ostream & Out, const Set & set)
{
  // display your Set here using out, not cout
  return out;
}

通过这种方式,您可以执行以下操作:

cout << "This is my set: " << mySet << endl;

【讨论】:

  • 我认为这样写不会有问题。我觉得如果我可以编写自己的头文件,我的很多项目会更容易,但是我的教授将它们包含在项目作业中,所以我别无选择,只能用另一种方式来做。 :( 但是,关于使用 Out 代替 cout 的部分是我没有想到的,所以谢谢你的回答!
  • 仅供参考:一旦您开始实际尝试写入 ostream,上述代码就无法使用我系统上的任何编译器(Linux:gcc 或 icc)进行编译。 ostream 的 gcc 实现没有为基本类型提供 operator&lt;&lt; 的“const”版本,因此您需要使用非 const ostream& 对象。
【解决方案2】:

在您的显示方法中,您明确使用了 cout。但这是“标准输出”。该方法应该使用 Out。因此,在 display() 中,只需将每次出现的 cout 替换为 Out。

然后使用 display( cout ); 在你的电话中

【讨论】:

    【解决方案3】:

    您需要做的是替换掉所有您使用过 cout 的地方。也将 cout 作为参数传递,例如 x.display(cout)。这是因为,cout 不是 ostream 类型,所有这些初始化都是在 iostream 中完成的。

    【讨论】:

      【解决方案4】:

      正如你所说,display 需要一个 std::ostream &amp; 类型的参数。

      在您的显示方法实现中,您在std::cout 中输出,这违背了接收输出流作为方法参数的逻辑。这里,参数的重点是display 调用者将能够提供他选择的输出流。如果他的选择恰好是标准输出,他会写:

      x.display(std::cout);
      

      这意味着您的display 实现应该只在Out 参数中输出,而不是std::cout

      还要注意:

      • 您的display 实现返回一个不应该返回的值(void 返回类型)
      • 为了清楚起见,我在答案中使用了 std:: 前缀,但在您的情况下不需要它们,因为头文件包含 using namespace std;

      【讨论】:

      • 哦,谢谢你的解释。我更改了我的实现文件,而不是使用 cout
      • +1 - 最好使用这样的参数,因为这允许您的类无需修改即可支持输出到任何其他 C++ 标准输出流(例如 ostringstream、ofstream)
      猜你喜欢
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多