C++ 使用ostream作为参考(C+;+;)

C++ 使用ostream作为参考(C+;+;),c++,pass-by-reference,ostream,C++,Pass By Reference,Ostream,我有一个家庭作业,其中头文件是提供给我们的,是不可更改的。我不知道如何正确使用“显示”功能,所以这里是相关代码 头文件: #ifndef SET_ #define SET_ typedef int EType; using namespace std; #include <iostream> class Set { private: struct Node { EType Item; // User data item N

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

头文件:

#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
#ifndef集合_
#定义集_
typedef-int-EType;
使用名称空间std;
#包括
类集
{
私人:
结构体类型
{
EType项;//用户数据项
Node*Succ;//链接到节点的后续节点
};
unsigned Num;//集合中用户数据项的数量
Node*Head;//链接到链的头
公众:
//在电视机上执行的各种功能
//显示集合的内容
//
无效显示(ostream&)常数;
};
#恩迪夫
下面是我对“显示”功能的实现:

void Set::显示(ostream&Out)常量
{
节点*温度=头部;

cout正如您所说,
显示
需要类型为
std::ostream&
的参数

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

x.display(std::cout);
这意味着您的
显示
实现应该只在
Out
参数中输出,而不是
std::cout

还请注意:

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

您需要做的是替换掉所有使用cout的位置。还可以将cout作为参数传递,如x.display(cout)。这是因为cout是非类型的ostream,所有初始化都在iostream中完成。

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

然后使用显示器(cout);
在调用中,您没有传入ostream对象。请将其更改为:

X.display(cout);
然后在你的类中用Out替换cout的所有出现。 另外,display函数应该返回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;
}

const-ostream&operator这是一个很好的新手问题。所有不相关的部分都被删除了,但(几乎)下一次,只需添加确切的错误消息,并指出它指向的精确的行,它就很完美。哦,谢谢解释。我改变了我的实现文件,这样就不用使用CUT+1——使用这样的参数是更好的,因为这允许你的类支持输出到任何其他C++标准。如果我能写自己的头文件,我觉得我的很多项目会更容易,但是我的教授把它们和项目作业一起写,所以我别无选择,只能用另一种方式(然而,关于使用Out而不是cout的部分是我没有想到的,因此感谢您的回答!仅供参考:一旦您开始实际尝试写入ostream,上述代码就不会在我的系统上使用任何编译器(Linux:gcc或icc)编译。ostream的gcc实现不提供
操作符的“const”版本
X.display(cout);
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;