【发布时间】:2019-06-29 08:46:42
【问题描述】:
我想将 int16_t 值写入文件。
因此我尝试重载 std::ofstream::put() 方法。
#include <fstream>
#include <cstdint>
class Ofstream : public std::ofstream
{
public:
Ofstream( const std::string & s) : std::ofstream(s) {}
// for little-endian machines
Ofstream & put(int16_t val)
{
char lsb, msb;
lsb = (char)val;
val >>= 8;
msb = (char)val;
put(lsb) && put(msb);
return *this;
}
~Ofstream() {}
};
int main()
{
int16_t val = 0x1234;
Ofstream ofile( "test");
ofile.put(val);
}
在这我总是得到一个分段错误,那么有什么问题呢?
【问题讨论】:
-
从
std::ofstream继承可能是个坏主意。 -
我认为您的
put版本隐藏了基类版本,因此您会遇到堆栈溢出。使用调试器很容易检查。但是 πάνταῥεῖ 是对的,这不是这样做的方法。 -
正如约翰所指出的,您的
put()版本隐藏了继承的版本。因此,put()在您的put()中的调用正在递归调用自身。结果是无限递归。从标准流类继承是一个坏主意 - 最好使用包含(即ostream作为类的成员,而不是基类)。 -
我怀疑 OP 期望基类
put(char)被调用,而不是派生类中的put(int16_t)实现,因为它在技术上是更好的匹配(如果它不是被隐藏的话)。 -
@WhozCraig - 是的。太糟糕了,期望正是隐藏规则旨在防止的一个例子。