大家好,我的类(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/