Использование ostream в качестве ссылки (С++)

У меня есть домашнее задание, где заголовочный файл предоставляется нам и неизменен. У меня возникли проблемы с выяснением того, как правильно использовать функцию "display" , поэтому вот соответствующий код.

Файл заголовка:

#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 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

Вот моя реализация функции "display" :

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" в качестве хорошего параметра?

Ответ 1

Как вы сказали, display ожидает параметр типа std::ostream &.

В реализации вашего метода отображения вы выводите в std::cout, который игнорирует логику получения выходного потока в качестве параметра для метода. Здесь точка параметра заключается в том, что вызывающий display сможет предоставить выходной поток по своему выбору. Если его выбор будет стандартным выходом, он напишет:

x.display(std::cout);

Это означает, что ваша реализация display должна выводиться только в параметре Out, а не std::cout.

Также обратите внимание:

  • Ваша реализация display возвращает значение, которое оно не должно (void return type)
  • Я использую префикс std:: в своем ответе для ясности, но они не требуются в вашем случае, поскольку заголовочный файл содержит using namespace std;.

Ответ 2

Что вам нужно сделать, это заменить все места, которые вы использовали cout. Также передайте cout как параметр, такой как x.display(cout). Это связано с тем, что cout отключен от типа ostream, и вся эта инициализация выполняется в iostream.

Ответ 3

В вашем методе отображения вы явно используете cout. Но это "стандарт". Метод должен скорее использовать Out. Поэтому в display() просто замените каждое появление cout на Out.

Затем используйте display (cout); в вашем обращении

Ответ 4

Вы не передаете объект 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;