首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ostream/ofstream继承问题

ostream/ofstream继承问题
EN

Stack Overflow用户
提问于 2011-06-24 00:37:24
回答 2查看 3.3K关注 0票数 5

我正在写一个C++程序,我需要一些帮助来理解一个错误。

默认情况下,我的程序打印到终端(STDOUT)。但是,如果用户提供了文件名,程序将打印到该文件。如果我写入终端,我将使用std::cout对象,而如果我写入文件,我将创建并使用std::ofstream对象。

但是,我不想不断地检查我是否应该这样写到终端或文件。由于std::coutstd::ofstream对象都继承自std::ostream类,因此我想我应该创建一种接受std::ostream对象的print_output函数。在调用这个函数之前,我会检查是否应该打印到一个文件。如果是这样,我将创建std::ofstream对象并将其传递给print函数。如果没有,我将简单地将std::cout传递给打印函数。这样打印函数就不必担心打印到哪里了。

我认为这是一个好主意,但我无法获得要编译的代码。我在这里创建了一个过于简单的示例。这是代码。

代码语言:javascript
复制
#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);
  }
}

这里的...and是编译时错误。

代码语言:javascript
复制
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)’

你知道为什么我会得到这些错误吗?是我写错了什么代码,还是我的方法有根本的错误?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-24 00:39:13

流是不可复制的,所以您不能通过值将它们传递给函数。请改用引用。

代码语言:javascript
复制
void print_something(std::ostream& outstream);
票数 7
EN

Stack Overflow用户

发布于 2011-06-24 00:40:23

您不能复制流。因此,您需要通过引用传递:

代码语言:javascript
复制
void print_something(std::ostream & outstream)
                             //  ^^^  pass by reference.
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6457591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档