c++ - 接口(interface)(抽象类)设计的最佳方法?

标签 c++ error-handling abstract-class

我搜索过这个主题,但找不到相关的答案...

假设我有一个这样声明的抽象类:

class Abstract{

    virtual Interface* createHandle() = 0;

    virtual ~Abstract() = 0;
};

基本上,一个抽象类提供了一个返回类接口(interface)(也是抽象类)的任何实现的唯一函数。

我想知道如何用这种设计来处理错误。如果 createHandle() 遇到错误并且无法返回指向接口(interface)实现的指针,正确处理和通知此错误的最佳方法是什么?

我首先想到的是返回一个空指针,然后在调用代码中检查返回的指针是否为空。它会工作,但我发现这个设计很糟糕,因为接口(interface)(即抽象)从不暗示 createHandle() 可以返回空指针,或者返回空指针以表示错误(并且我发现仅仅留下一条评论说“如果出错应该返回 null”这一事实非常糟糕。

然后,我想到了在Interface指针中携带这个信息。也就是说,向设置/获取某种错误代码的类添加两个公共(public)非虚函数。但我一点也不喜欢它,因为它与接口(interface)类无关,而是与接口(interface)不知道的 createHandle() 的实现有关(即有一个存储错误的成员变量与使用这个类的代码有关,在我看来这感觉非常错误,尽管我可能是错的)。

我想知道,什么是指定此函数在发生错误时的行为方式的优雅方式(以完全独立于任何实现的方式,实际上恰恰相反:强制实现处理错误指定方式)。

最佳答案

如果情况异常且必须处理,您可以抛出异常(尽管您不能强制执行此操作,但至少将情况标记为异常)。否则返回 nullptr 完全没问题。

例如,如果您想读取一个可能不存在的文件 - 这不是程序错误,而是预期的情况,因此返回 nullptr 是有意义的,例如 FileReader。

同时表明 nullptr 是一个有效的想法并强制检查你可以返回 boost::Optional 或你自己的可选类,它也可能包含错误代码。

关于c++ - 接口(interface)(抽象类)设计的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16545135/

上一篇:C++数组访问

下一篇:c++ - 排序子网格/VBO

相关文章:

c++ - 我可以在不重新编译 exe 文件的情况下更改 dll 接口(interface)吗?

c++ - 麦片序列化错误

python - Python回调处理程序-更好的错误消息?

c++ - std::tuple 的笛卡尔积

spring - Spring 框架中的Jackson反序列化错误处理

javascript - dom 搜索 id 返回错误 - 如何处理?

php - 接口(interface)和抽象类的优点是什么?

java - 在泛型方法的实现中强制类型安全

具有队列作为成员的类的 C++ 构造函数和析构函数

c++ - 在修改序列的同时迭代它。使用 vector 还是列表? C++/标准语言