Создайте функцию печати, которая принимает в качестве аргумента ostream и записывает в этот поток

В настоящее время я отвечаю на вопросы, касающиеся перегрузки операторов в C ++. У меня есть вопрос:

Создайте простой класс, содержащий int, и перегрузите оператор + как функцию-член. Также предоставьте функцию-член print (), которая принимает ostream & в качестве аргумента и печатает в этот ostream &. Протестируйте свой класс, чтобы убедиться, что он работает правильно.

Я могу создать класс и написать функцию оператор +, но я действительно не понимаю вторую часть вопроса. Пока что в моем исследовании C ++ я действительно не встречал ostream, и поэтому не уверен, можно ли явно создать такой поток. Я пробовал использовать:

std :: ostream o;

Однако это вызывает ошибку. Может ли кто-нибудь просветить меня, как мне создать эту функцию, пожалуйста?


person Bap Johnston    schedule 24.08.2011    source источник
comment
cout - это ostream. Вы уверены, что не сталкивались с этим?   -  person Bill    schedule 24.08.2011
comment
Я действительно понимаю, что cout - это ostream, однако это столько же, сколько iv использовал его, однако iv никогда не просили передать его в качестве аргумента, поэтому я не был уверен, как это сделать.   -  person Bap Johnston    schedule 24.08.2011


Ответы (2)


Пока что в моем исследовании C ++ я действительно не встречал ostream, и поэтому не уверен, можно ли явно создать такой поток. Я пробовал использовать: std :: ostream o;

Вы, должно быть, что-то упустили, потому что потоки важны. Кстати, std :: cout - это переменная типа std :: ostream. Использование более или менее похоже на это

#include <iostream> //defines "std::ostream", and creates "std::ofstream std::cout"
#include <fstream> //defines "std::ofstream" (a type of std::ostream)
std::ostream& doStuffWithStream(std::ostream &out) { //defines a function
    out << "apples!";
    return out;
}
int main() {
    std::cout << "starting!\n"; 
    doStuffWithStream(std::cout); //uses the function

    std::ofstream fileout("C:/myfile.txt"); //creates a "std::ofstream"
    doStuffWithStream(fileout); //uses the function

    return 0;
}
person Mooing Duck    schedule 24.08.2011
comment
Я понимаю, что cout - это тип ostream, однако, поскольку iv никогда не приходилось передавать ostream в качестве аргумента функции, я не знал, как это сделать. Я думал иметь ссылку на ostream в качестве аргумента в функции, которую мне сначала нужно было создать объект ostream, похоже, это не так. Спасибо, что помогли прояснить это. - person Bap Johnston; 24.08.2011
comment
Функция определение еще не требует, чтобы какие-либо объекты действительно существовали, ей нужно знать только о типах. Очевидно, что в какой-то момент вам нужно создать поток, чтобы перейти к функции. Здесь я передаю std :: cout (который создается автоматически, когда вы включаете ‹iostream›) и fileout, который я создаю сам. - person Mooing Duck; 24.08.2011

Вы не создаете ostream, вы создаете ссылку ostream, как сказано в вашем вопросе упражнения. И вы делаете это в списке параметров вашей функции печати, т.е.

void print(std::ostream & os);

Затем вы можете вызвать эту функцию, передав cout или любой другой объект класса, производного от ostream (ofstream, ostringstream и т. Д.)

person Benjamin Lindley    schedule 24.08.2011
comment
Спасибо за помощь. Обычно при передаче аргумента вам нужен объект для передачи, поэтому меня смутил этот вопрос, я подумал, что мне нужно создать объект типа ostream. - person Bap Johnston; 24.08.2011