2011-06-23 4 views
3

Я пишу программу на C++, и мне нужна помощь в понимании ошибки.Проблема с наследованием ostream/ofstream

По умолчанию моя программа печатает на терминал (STDOUT). Однако, если пользователь предоставляет имя файла, программа будет печатать в этом файле. Если я пишу на терминал, я буду использовать объект std::cout, тогда как если я напишу в файл, я создам и использую объект std::ofstream.

Однако я не хочу постоянно проверять, должен ли я так писать на терминал или файл. Поскольку объекты std::cout и std::ofstream наследуются от класса std::ostream, я решил, что создам функцию print_output, которая принимает объект std::ostream. Прежде чем вызвать эту функцию, я проверил бы, должен ли я печатать в файл. Если это так, я создам объект std::ofstream и передам его функции печати. Если нет, я просто передаю std::cout функции печати. Функция печати тогда не должна беспокоиться о том, где она печатается.

Я думал, что это была хорошая идея, но я не могу получить код для компиляции. Я создал здесь упрощенный пример. Вот код ...

#include <fstream> 
#include <iostream> 
#include <stdio.h> 

void print_something(std::ostream outstream) 
{ 
    outstream << "All of the output is going here\n"; 
} 

int main(int argc, char **argv) 
{ 
    if(argc > 1) 
    { 
    std::ofstream outfile(argv[1]); 
    print_something(outfile); 
    } 
    else 
    { 
    print_something(std::cout); 
    } 
} 

... и вот ошибка времени компиляции.

dhrasmus:Desktop standage$ g++ -Wall -O3 -o test test.c 
/usr/include/c++/4.2.1/bits/ios_base.h: In copy constructor ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’: 
/usr/include/c++/4.2.1/bits/ios_base.h:779: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private 
/usr/include/c++/4.2.1/iosfwd:55: error: within this context 
/usr/include/c++/4.2.1/iosfwd: In copy constructor ‘std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)’: 
/usr/include/c++/4.2.1/iosfwd:64: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’ first required here 
test.c: In function ‘int main(int, char**)’: 
test.c:15: note: synthesized method ‘std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)’ first required here 
test.c:15: error: initializing argument 1 of ‘void print_something(std::ostream)’ 

Любые идеи относительно того, почему я получаю эти ошибки? Я что-то неправильно сформулировал или что-то принципиально неправильно с моим подходом?

Спасибо!

ответ

6

Потоки не копируются, поэтому вы не можете передать их функции по значению. Вместо этого используйте ссылку.

void print_something(std::ostream& outstream); 
+0

Ничего себе, это было просто. Благодаря! –

4

Вы не можете копировать поток. В результате вам необходимо пройти по ссылке:

void print_something(std::ostream & outstream) 
          // ^^^ pass by reference. 
Смежные вопросы