我搜索过这个主题,但找不到相关的答案...
假设我有一个这样声明的抽象类:
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/