Использование 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;