C++ const 基于输入的静态启动

标签 c++ static constants

大家好,我的类(class)有静态问题:

class Monster
{
private:
     static const bool hard; 
     //more staff here
};

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

但我想知道我是否可以根据用户输入启动
像 If(wantToBeHard) hard = true;
这意味着它必须在某种方法中,对吗? 有什么办法吗?

最佳答案

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

bool AskUser()
{
    ....
}

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

const bool Monster::hard = AskUser();

为了清楚起见,这里有一个完整的、可编译的示例:

#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();

如果您希望更好地控制此初始化发生的时间,则必须放弃对 const 的要求。不过,这应该不是问题,只要成员是私有(private)的,您仍然可以完全控制它是否被更改。例如

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;

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

关于C++ const 基于输入的静态启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417697/

相关文章:

java - 从静态方法实例化子类

c++ - 为什么 clang 不像 #define 那样优化全局常量?

php - 更改先前定义的常量的值

c++ - 如何在 qt 5.3.0 中使用 qml 分析器?

c++ - 为什么虚拟函数在分配给 'new' 时不能未实现?

c++ - 指向具有外部链接的对象的指针作为非类型模板参数

c++ - 什么构成了 RValues?

c++ - 从名称服务器回复 c++ 中提取 DNS 记录 (MX) 详细信息

c++ - 为什么这段代码不能编译?

java - 为什么静态初始化 block 中不允许使用限定的静态最终变量?