问题 使用ostream作为参考(C ++)


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

头文件:

#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&作为参数。我的问题是,在将“display”作为一个好参数调用时,我在驱动程序文件中使用了什么?


2152
2017-11-18 16:26


起源

这是一个很好的形状的新手问题。删除了所有不相关的位,但(几乎)显示了所有相关位。下一次,只需添加确切的错误消息并指出它指向的确切行,它就是完美的。 - sbi
我会那样做的,谢谢! - user212562


答案:


正如你所说, display 期望参数类型 std::ostream &

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

x.display(std::cout);

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

另请注意:

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

11
2017-11-18 16:30



哦,谢谢你的解释。我更改了我的实现文件,以便使用out << blahblah而不是使用cout << blahblah。我也删掉了“退货”;行和使用std :: cout作为参数,程序最终编译并给了我输出!输出是地址,但我认为这是一个简单的解决方案。感谢您的帮助! :) - user212562
+1 - 使用这样的参数是可取的,因为这允许您的类支持输出到任何其他C ++标准输出流(例如ostringstream,ofstream)而无需修改 - Steve Townsend


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


0
2017-11-18 16:31





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

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


0
2017-11-18 16:31





你没有传入一个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;

0
2017-11-18 16:31



我不认为我这样写是有问题的。我觉得如果我能编写自己的头文件,我的很多项目会更容易,但是我的教授将它们包含在项目分配中,所以我没有其他方法可以选择。 :(但是,关于使用Out而不是cout的部分是我没有想到的,所以谢谢你的答案! - user212562
仅供参考:一旦您开始实际尝试写入ostream,上面的代码就无法使用我的系统上的任何编译器(Linux:gcc或icc)进行编译。 ostream的gcc实现不提供“const”版本 operator<< 对于基本类型,所以你需要使用非const ostream和对象。 - Ogre Psalm33