Используя OSTream в качестве ссылки (C ++)
-
26-09-2019 - |
Вопрос
У меня есть домашнее задание, где файл заголовка предоставляется нам, и является неизменным. У нас проблемы выяснить, как правильно использовать функцию «отображения», поэтому вот соответствующий код.
Файл заголовка:
#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 использует o Ostream & как параметр. Мой вопрос в том, что я использую в своем файле драйверов при вызове «отображения» в качестве хорошего параметра?
Решение
Как вы сказали, display
ожидает параметра типа std::ostream &
.
В вашем режиме реализации отображения вы выводятся в std::cout
который определяет логику получения выходного потока в качестве параметра к способу. Здесь точка параметра заключается в том, что display
Вызыватель сможет предоставить выходной поток его выбора. Если его выбор бывает стандартным выходом, он напишет:
x.display(std::cout);
Это означает, что ваш display
Реализация должна производиться только в Out
параметр и нет std::cout
.
Также обратите внимание, что:
- Твой
display
Реализация возвращает значение, которое он не должен (void
Тип возврата) - Я использую
std::
префикс в моем ответе на ясность, но они не требуются в вашем случае, когда файл заголовка содержитusing namespace std;
.
Другие советы
То, что вам нужно сделать, это замена для всех мест, которые вы использовали Cout. Также пройдите Cout в качестве параметра, такого как X.Display (Cout). Это связано с тем, что Cout не выключен типа OSTream, и все это инициализация выполняется в iostream.
В вашем методе отображения вы ясно используете Cout. Но это «стандартный выход». Метод должен скорее использовать. Таким образом, на дисплее () просто замените каждое возникновение Cout без.
Затем используйте дисплей (Cout); в вашем вызове
Вы не проходите в объекте OSTream. Измените это к этому:
X.display(cout);
Затем в вашем классе замените все вхождения Cout без. Кроме того, функция отображения должна вернуть 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;