Использование ostream в качестве ссылки (C ++) - PullRequest
11 голосов
/ 18 ноября 2010

У меня есть домашнее задание, в котором нам предоставляется файл заголовка, и его нельзя изменить.У меня проблемы с выяснением того, как правильно использовать функцию «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'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

Вот моя реализация функции «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» в качестве хорошего параметра?

Ответы [ 4 ]

11 голосов
/ 18 ноября 2010

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

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

x.display(std::cout);

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

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

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

Вы не передаете объект ostream.Измените его следующим образом:

X.display(cout);

Затем в вашем классе замените все вхождения cout на Out.Кроме того, функция отображения должна возвращать const ostream & вместо void.Вы должны также использовать константные ссылки 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 голосов
/ 18 ноября 2010

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

Затем используйте дисплей (cout);в вашем звонке

0 голосов
/ 18 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...