如何在 C++ 中赋值之前验证 const 成员变量的初始化

Sil*_*man 1 c++ validation constructor constants member

假设我有一个带有 const int 成员变量的简单类:

class MyClass{
    public:
        Myclass(int x, int y);
    private:
        const int importantNumber;
        int anotherNumber;
};

MyClass::MyClass(int x, int y) :importantNumber{x}
{
    this->anotherNumber = y;
}
Run Code Online (Sandbox Code Playgroud)

由于int importantNumberis const,我只能在构造函数创建对象期间设置它(使用成员初始化列表,如上所示)。

现在的问题是:在实际使用该值创建 importantNumber 之前,如何为构造函数的参数 x 添加验证?是否可以创建一个static int MyClass::validation(int a)并在构造函数的成员初始化列表上使用它,例如importantNumber{validation(x)}

即使有可能,还有更好的方法吗?

nwp*_*nwp 5

你只需添加它即可。

MyClass::MyClass(int x, int y) : importantNumber{validate(x)}
{
    this->anotherNumber = y;
}
Run Code Online (Sandbox Code Playgroud)

int validate(int original)函数现在可以返回其他内容x,或者抛出异常,assert或者要求用户确认,无论您认为合适。

如果这只是一个简单的检查并且您不想编写函数,validate则可以使用 lambda:

MyClass::MyClass(int x, int y) :importantNumber{
    [](int number){
        assert(number > 0);
        return number;
    }(x)}
{
    this->anotherNumber = y;
}
Run Code Online (Sandbox Code Playgroud)

尽管如果做得太过分,这可能会变得有点复杂。