小编kri*_*_sw的帖子

C++:我可以使赋值运算符"显式"

我的任务是在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++文档中所读到的,只有构造函数和转换运算符可以声明为显式.

我的问题

  1. 为什么显式不允许赋值运算符或其他方法?IMO将允许任何方法显式化也很有意义.
  2. 是否有其他解决方案可以防止赋值运算符的隐式类型转换?

c++

6
推荐指数
1
解决办法
1236
查看次数

用作默认参数的静态成员导致无法解析的外部

我有一个使用静态成员变量作为默认参数的令人困惑的问题。由于相同的语言构造在不同的地方工作,它可能与项目 (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
推荐指数
1
解决办法
344
查看次数

标签 统计

c++ ×2