c++ - 继承自 std::exception,std::exception 定义中的歧义

标签 c++ exception

所以我有点困惑,我一直在四处寻找,试图为我自己的类型确定一种从 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;
    };

现在是将这些成员包含在基类 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(); 
    }; 
} 

当谈到可替代性时,这是您必须遵守的契约。该标准定义了每个成员的细节。通常唯一需要考虑的是 what() 返回一个 “以空字符结尾的多字节字符串,适合显示为 wstring。另一部分是遵守和确保 throw() 契约。

关于c++ - 继承自 std::exception,std::exception 定义中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1099436/

相关文章:

C# - 字符串未被识别为有效的日期时间

exception - Kotlin 构造函数属性和调用不同的父类(super class)构造函数

Java 创建具有特定状态代码的自定义异常类

c++ - XML文件生成器

c++ - 为什么我可以将字符串文字初始化为 const char* 和 QString 而不是 QString*?

python - 将指针从 Python 传输到 dll 并取回修改后的值

java - 抛出异常或返回 null

c++ - opengl 3d纹理问题

c++ - 迭代 const 容器时,编译器会展开 "for"循环吗?

java - 如何让代码仅在抛出异常时运行?