大家好,我的班级有静电问题:
class Monster
{
private:
static const bool hard;
//more staff here
};
我知道我可以像const bool Monster :: hard
那样发起它但我想知道我是否可以根据用户输入发起
像If(wantToBeHard)hard = true;
这意味着它必须采用某种方法或某种方式吗?
有办法做到这一点吗?
答案 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
对象是棘手的事情,应该小心对待)。所以不要这样做。