ostream/ofstream继承问题
Problem with ostream/ofstream inheritance
我正在写一个C++程序,我需要一些帮助来理解一个错误。
默认情况下,我的程序打印到终端(STDOUT)。但是,如果用户提供文件名,程序将打印到该文件中。如果我正在向终端写入,我将使用std::cout
对象,而如果我正在写入文件,我将创建并使用std::ofstream
对象。
然而,我不想不断地检查我是否应该这样写到终端或文件。由于std::cout
和std::ofstream
对象都继承自std::ostream
类,所以我想创建一种接受std::ostream
对象的print_output
函数。在调用此函数之前,我会检查是否应该打印到文件中。如果是这样,我将创建std::ofstream
对象并将其传递给print函数。如果没有,我将简单地将std::cout
传递给打印函数。打印功能就不必担心打印到哪里了。
我认为这是个好主意,但我无法编译代码。我在这里创建了一个过于简化的示例。这是代码。。。
#include <fstream>
#include <iostream>
#include <stdio.h>
void print_something(std::ostream outstream)
{
outstream << "All of the output is going heren";
}
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)’
你知道我为什么会犯这些错误吗?我的代码有错吗,或者我的方法有根本性的错误吗?
谢谢!
流是不可复制的,因此不能按值将它们传递给函数。请改用引用。
void print_something(std::ostream& outstream);
您不能复制流。因此,您需要通过参考:
void print_something(std::ostream & outstream)
// ^^^ pass by reference.
相关文章:
- 混合组合和继承的C++问题
- 运算符继承和 cpp 核心准则 c.128 的问题
- 类继承,ENUM 与 AST 类实现的问题
- C++ 多级虚拟继承编译问题
- 如何解决此问题(基础模板和继承)
- 模板继承问题
- C++ 继承向量问题(无限循环+在其他类中使用向量的问题)
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 继承此C++代码有什么问题
- 一个关于继承和引用的C++问题
- C++继承和"常量"交互的问题
- 在钻石问题的求解中,为什么要虚拟地继承两次grand-parent类
- C++的抽象类继承和构造函数的问题
- C++:继承和列表函数作为类成员的问题
- SIGSEGV 因为基/派生类的继承问题
- 关于异常继承中的语法的问题
- C++继承的类设计问题
- 关于继承和覆盖的问题
- C++ 构造函数问题 // 继承的类
- 对复制构造函数的c++ OOP程序问题?继承