我建了一个类,用来往文件中写东西,我继承了std::ofstream ,如果我执行以下操作,会不会有“不良反应”,不过我想知道,它写到哪里去了。
class CMsgLog : public std::ofstream
{
public:
void OpenFile();
}
void CMsgLog:: OpenFile()
{
if ( m_bWrite )
{
open( "test.txt", std::ios_base::app );
}
}
void CTest::Test()
{
CMsgLog log;
log << "测试"; //注意我没有执行OpenFile
//也就是说,我没有打开文件,那“测试”写到哪里去了?
}
请高手值点。
谢谢!!!
zhenbe(一头栽在C里面)
stlport的源代码比较复杂,如果你对标准库的结构不清楚的话可能不好找,
下面只说说我查的过程和结果:
std::ofstream继承自std::basic_ostream
所以我查看了后者的无参构造函数,发现它对所有内部成员都赋零或调用无参构造.
进而我注意了basic_ofstream中没有关于operator<<的定义,所以进而发现它定义在
basic_ostream中:
_Self& operator<<(basic_streambuf<_CharT, _Traits>* __buf);
# ifndef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
// this is needed for compiling with option char = unsigned
_Self& operator<<(unsigned char __x) { _M_put_char(__x); return *this; }
# endif
进而发现对<<操作的关键在于_M_put_char(__x); 函数
而这一函数有一个前置条件:
sentry __sentry(*this);
if (__sentry) {
...
}
sentry是一个内部类,定义在basic_ostream中
而它的逻辑转型定义为
operator bool() const { return _M_ok; }
即_M_ok的值.
根据sentry的构造函数_M_ok(_M_init(__str))
其中__str是basic_stream本身,_M_init可能类似basic_stream的初始化函数.
这里我们可以想当然的说_M_init一定返回false.所以结果就是
<<操作,根本就没用,输入的数据被简单的忽略了.