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;
这意味着它必须在方法中或正确的东西中?有没有办法做到这一点?
您可以创建一个普通函数(不是非静态成员函数),它要求用户输入并返回一个 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对象是棘手的事情,应该小心对待)。所以不要那样做。