使用std::ostream作为类成员
Using std::ostream as a class member
我正在处理一个简单的进度指示器类,我有一个关于使用std::ostream
对象作为类成员的问题。以下示例在OSX和Linux上正确编译和运行。
#include <iostream>
#include <string>
struct ProgressIndicator {
public:
ProgressIndicator(unsigned int update_interval, std::string message,
std::ostream& outstream = std::cerr)
: update_interval(update_interval), message(message),
stream(outstream.rdbuf()), _counter(0), _interval(update_interval)
{
}
void increment(unsigned int by = 1)
{
_counter += by;
if(_counter >= _interval) {
stream << message << _counter << std::endl;
_interval += update_interval;
}
}
unsigned int get_count()
{
return _counter;
}
protected:
unsigned int update_interval;
std::string message;
std::ostream stream;
private:
unsigned long _counter;
unsigned long _interval;
};
int main()
{
ProgressIndicator p1(5, "progress <stdout> ", std::cout);
for(int i = 0; i < 15; i++) {
p1.increment();
}
ProgressIndicator p2(5, "progress <stderr> ", std::cerr);
for(int i = 0; i < 15; i++) {
p2.increment();
}
return 0;
}
我知道std::ostream
对象不能复制,必须通过引用传递。但我不明白为什么用stream(outstream)
初始化不起作用,以及为什么我不得不求助于rdbuf()
破解。没有比这更好、更地道的方法吗?
您仍在复制std::ostream
。即使构造函数没有复制参数,它仍然需要以某种方式将对象复制到ProgressIndicator::stream
中。
解决问题的一种方法是存储对流的引用,尽管只有当你知道流对象将比你的类实例更持久时,这才有效:
struct ProgressIndicator {
ProgressIndicator(std::ostream& outstream = std::cerr /* ... */)
: stream(outstream) /* ... */ {}
// ...
protected:
std::ostream& stream;
// ...
};
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- 我们如何将Ostream函数作为类的成员函数实现,而不是作为朋友函数,以便我可以用作虚拟函数
- 静态与成员运算符重载:标准::运算符<< 和 std::ostream::运算符<<
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- ostream << 具有模板类的操作员,无法访问私有成员
- 派生成员和重载Ostream运算符
- 我的 ostream 和 istream 好友函数无法访问私有类成员
- 使用std::ostream作为类成员