C++标准库笔记:13.12.3 以辅助函数完成I/O
2017-06-12 08:54
393 查看
如果执行IO操作符时需要存取对象的私有成员,通常有以下两种方法:
否则的话,一旦用上继承,使用friend的方法就有很大的局限性。friend函数不能成为虚函数,所以程序可能会调用错误的函数。例如,某个基类引用实际指向一个派生类引用,并补当作input操作符的参数,则被调用的将是基类的操作符。为了避免出现这种情况,继承类不得实作自己的IO操作符,并且还要显示调用(因为不是虚函数)。
因此,使用第一种方法通用的多,尽管你在其它文件或书籍上看到的绝大多数例子使用的是friend函数,你最好将第一种方法视为标准作法。
使用辅助函数
IO操作符应该将实际任务委派给辅助的成员函数。这种技术允许具有多态性,如下:class Fraction { public: Fraction( int nNumerator = 0, int nDemominator = 1 ) :m_nNumerator( nNumerator ), m_nDemominator( nDemominator ) {} //辅助输入输出函数 virtual void PrintOn( std::ostream& strm ) const { strm << m_nNumerator << '/' << m_nDemominator; } virtual void ScanFrom( std::istream& strm ) { strm >> m_nNumerator; strm.ignore(); //ignore '/' strm >> m_nDemominator; } private: int m_nNumerator; //分子 int m_nDemominator; //分母 }; std::ostream& operator << ( std::ostream& os, const Fraction& f ) { f.PrintOn( os ); return os; } std::istream& operator >> ( std::istream& in, Fraction& f ) { f.ScanFrom( in ); return in; }
设置IO操作为类的友元函数
访问类的私有成员,也可以将IO操作符函数设计为类的友元函数class Fraction { friend std::ostream& operator << ( std::ostream&, const Fraction&); friend std::istream& operator >> ( std::istream&, Fraction& ); public: Fraction( int nNumerator = 0, int nDemominator = 1 ) :m_nNumerator( nNumerator ), m_nDemominator( nDemominator ) {} private: int m_nNumerator; //分子 int m_nDemominator; //分母 }; std::ostream& operator << ( std::ostream& os, const Fraction& f ) { os << f.m_nNumerator << '/' << f.m_nDemominator; return os; } std::istream& operator >> ( std::istream& in, Fraction& f ) { in >> f.m_nNumerator; in.ignore(); //ignore '/' in >> f.m_nDemominator; return in; }
对比
如果你的类不会作为其他类的基类,以上两种方法都一样。否则的话,一旦用上继承,使用friend的方法就有很大的局限性。friend函数不能成为虚函数,所以程序可能会调用错误的函数。例如,某个基类引用实际指向一个派生类引用,并补当作input操作符的参数,则被调用的将是基类的操作符。为了避免出现这种情况,继承类不得实作自己的IO操作符,并且还要显示调用(因为不是虚函数)。
因此,使用第一种方法通用的多,尽管你在其它文件或书籍上看到的绝大多数例子使用的是friend函数,你最好将第一种方法视为标准作法。
相关文章推荐
- C++标准库笔记:13.12.4 以非格式化函数完成自定义IO操作符
- 【CI学习笔记】从零开始,表单辅助函数
- editplus配置笔记(新建文件模板、代码美化、PHP手册、函数自动完成)
- libevent笔记-辅助函数/类型
- C++标准库笔记:13.5 标准I/O函数
- CI 笔记,借鉴的4个辅助自定义函数
- Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..
- netfilter各个HOOK的关系简介(笔记中已经总结到函数调用流程中)
- PHP学习笔记(整理完成)
- [转载]SQlite 常用函数学习笔记
- STL vector 辅助函数
- C++ Template学习笔记之函数模板(4)——显式模板实参
- 用于directshow的一些辅助函数
- C++ Template学习笔记之函数模板(1)——函数模板定义
- Oracle分析函数学习笔记1
- php学习笔记--php常用函数及其应用(未完成)
- 易语言支持库“辅助调试支持库”1.5版已经完成,将择机发布。
- C++中虚函数学习笔记
- T-SQL: 三个通用的与日期相关的,辅助按周(星期日是周的最后一天)汇总的自定义函数
- 易语言支持库“辅助调试支持库”1.5版已经完成,将择机发布。