我的任务是在C++类库中迁移错误处理的概念.之前简单返回bool(成功/失败)的方法应该被修改以返回一个Result传达机器可读错误代码和人类可读解释的对象(以及一些在这里无关紧要的解释).
遍历数千行代码是容易出错的,因此我尝试从编译器获得此任务的最佳支持.
我的结果类 - 在其他成员方法中 - 有一个构造函数,它构造了代码的结果和代码的赋值运算符:
class Result
{
public:
typedef unsigned long ResultCode;
explicit Result(ResultCode code); // (1)
Result& operator=(ResultCode code); // (2)
};
Run Code Online (Sandbox Code Playgroud)
备注:我通常会使用枚举类来ResultCode解决我的问题,但这不是一个选项.这是因为主要的设计目标是Result在不同的库中使用,每个库都应定义自己的结果代码集,而不需要一个大的头文件来定义所有库的所有可能的结果代码.实际上,每个类都应该能够定义本地结果代码,以便可以从类头中获得可能的结果代码列表.因此代码不能枚举Result,它们必须由使用Result类的类定义.
避免隐式转换
return true;
Run Code Online (Sandbox Code Playgroud)
客户端代码中的语句,构造函数已声明为显式.但是在嵌套方法调用中,会出现另一个问题.说,我有一个方法
bool doSomething()
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
我在一个返回一个Result对象的函数中使用它.我想转发嵌套调用的结果代码
Result doSomethingElse
{
Result result = doSomething();
return result;
}
Run Code Online (Sandbox Code Playgroud)
使用当前实现Result的赋值运算符,这不会给我一个编译器错误 - doSomething()的布尔返回值被隐式转换为unsigned long.
正如我在C++文档中所读到的,只有构造函数和转换运算符可以声明为显式.
我的问题
我有一个使用静态成员变量作为默认参数的令人困惑的问题。由于相同的语言构造在不同的地方工作,它可能与项目 (DLL) 的相互依赖关系有关。所以如果我的例子太复杂,请接受我的歉意,但我应该画出整个画面,因为我不知道出了什么问题。
我有一个基类(代表一种错误代码)
错误库文件
class ErrorBase
{
public:
typedef unsigned long ErrorCode;
/// here go the error codes. For reasons I do not want to explain, I cannot use an enumeration here.
static const ErrorCode ERROR_UNINITIALIZED;
static const ErrorCode ERROR_OK;
///...and so on
ErrorBase(ErrorCode theCode = ERROR_UNINITIALIZED);
};
Run Code Online (Sandbox Code Playgroud)
...在ErrorBase.cpp 中,我正在为代码赋值......
const ErrorBase::ErrorCode ErrorBase::ERROR_UNINITIALIZED = 0xffffffff;
const ErrorBase::ErrorCode ErrorBase::ERROR_OK = 0x0;
//.. and so on...
Run Code Online (Sandbox Code Playgroud)
ErrorBase 从一个 DLL 导出,该 DLL 为我们的项目提供了一些通用类
现在我正在为更具体的错误派生另一个错误类,它具有特定于特定类型错误的附加属性。类SpecificError 是不同DLL 的一部分,该DLL 链接到包含ErrorBase 的通用DLL。我没有包含 dllimport/dllexport shebang,但是我们到处都在使用它,并且它适用于所有情况。如果您有疑问,我可以编辑我的代码示例。 …
c++ ×2