所以我有点困惑,我一直在寻找一种适合从我自己的类型继承std :: exception的方法.现在根据cplusplus.com(我知道这不一定是标准,这就是我要问的原因),std :: exception是一个没有成员的基类.但是,在查看我的标准库(VS 2005)的实现之后,使用两个成员变量明确定义了类std :: exception:
class _CRTIMP_PURE exception
{ // base of all library exceptions
...
private:
const char *_m_what;
int _m_doFree;
};
Run Code Online (Sandbox Code Playgroud)
现在是这个标准让这些成员包含在基类std :: exception中,我的理解是它不是.我的理由是我的派生异常类实际上只需要一个字符串来获取它的信息,因此这个实现可以正常工作.但是,我担心这是非标准的,因此我最好继承std :: exception并自己添加适当的成员+复制/赋值代码.
所述std::exception类的定义为:
namespace std {
class exception {
public:
exception() throw();
exception(const exception&) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
}
Run Code Online (Sandbox Code Playgroud)
这是您在可替代性方面必须遵守的合同.标准定义了每个成员的具体细节.通常需要考虑的唯一一个是what()返回"以空值终止的多字节字符串,适合显示为wstring".另一部分是服从并确保throw()合同.