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

时间:2014-03-14 23:44:45

标签: c++ static const

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

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

我知道我可以像const bool Monster :: hard

那样发起它

但我想知道我是否可以根据用户输入发起 像If(wantToBeHard)hard = true;
这意味着它必须采用某种方法或某种方式吗? 有办法做到这一点吗?

1 个答案:

答案 0 :(得分:4)

您可以创建一个普通函数(不是非静态成员函数),它要求用户输入并返回一个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的要求。它应该不是一个问题,只要该成员是私有的,您仍然可以完全控制它是否被更改。 e.g。

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;

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