基于输入的 C++ const 静态初始化

Lit*_*cod 1 c++ static constants

大家好,我的班级有静态问题:

class Monster
{
private:
     static const bool hard; 
     //more staff here
};
Run Code Online (Sandbox Code Playgroud)

我知道我可以像 const bool Monster::hard 一样启动它

但我想知道我是否可以根据用户输入启动
If(wantToBeHard) hard = true;
这意味着它必须在方法中或正确的东西中?有没有办法做到这一点?

Ben*_*ley 5

您可以创建一个普通函数(不是非静态成员函数),它要求用户输入并返回一个 bool 值:

bool AskUser()
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

然后只需使用该函数的返回值来初始化您的静态成员。

const bool Monster::hard = AskUser();
Run Code Online (Sandbox Code Playgroud)

为了澄清问题,这里有一个完整的、可编译的示例:

#include <iostream>
#include <string>

bool AskUser();

class Monster
{
public:
    static bool IsHard() { return hard; }
private:
    static const bool hard;
};

int main()
{
    if (Monster::IsHard())
        std::cout << "it is hard\n";
    else
        std::cout << "it is not hard\n";
}

bool AskUser()
{
    std::cout << "hard? ";
    std::string input;
    std::getline(std::cin, input);
    return input.size() && input[0] == 'y';            
}

const bool Monster::hard = AskUser();
Run Code Online (Sandbox Code Playgroud)

如果您想更好地控制何时进行此初始化,则必须放弃对const. 不过,这应该不是问题,只要成员是私有的,您仍然可以完全控制它是否被更改。例如

class Monster
{
public:
    static void SetHard()
    {
        static bool hard_is_set = false;
        if (hard_is_set)
            return;
        hard_is_set = true;
        hard = AskUser();
    }
private:
    static bool hard;
};

bool Monster::hard;
Run Code Online (Sandbox Code Playgroud)

这里一个可能的问题是有可能在SetHard外部调用函数main(例如在另一个静态对象的初始化中),如果发生这种情况,它可能在实际创建之前访问静态成员,从而导致未定义的行为。(static对象是棘手的事情,应该小心对待)。所以不要那样做。