请在此问题中假设gcc 7.2.1的版本
我想声明一个行为类似于const的全局变量,但是在执行程序之前无法检测到初始化它的值。换句话说,目标变量将在第一次分配时重新分配。
这个概念的丑陋方法如下:
#include<iostream>
int numberOfPeople; //Do not re-assign it after it first assign
int main(){
std::cin >> numberOfPeople; // Do not re-assign numberOfPeople since then !!!
// Following of codes omitted.
}
正如您所看到的,这是一种非常难看的方法,无法通过编译器进行检查。我想知道c ++中是否存在一种可以在变量首次分配后冻结变量的符号。
所以我可以编写这样的代码:
#include<iostream>
magic_notation int numberOfPeople;
int main(){
std::cin >> numberOfPeople; // Allowed as it's first assign.
// Median codes omitted.
numberOfPeople = 60. //Disallowed and will get an error message from compiler!
// Following codes omitted.
}
有没有像c ++中上面代码中的magic_notation
那样使用的符号?
答案 0 :(得分:1)
最好的方法是创建一个具有公共const
成员变量的类,该变量在构造函数中初始化:
struct InitInfo {
const int numberOfPeople;
InitInfo() numberOfPeople(getNumberOfPeople()) {
}
private:
static int getNumberOfPeople() {
int res;
cin >> res;
return res;
}
};
InitInfo initInfo;
现在您可以使用成员变量,如下所示:
int main() {
cout << initInfo.numberOfPeople << endl;
}
您也可以使用相同的方法初始化全局变量。
static int getNumberOfPeople() {
int res;
cin >> res;
return res;
}
const int numberOfPeople = getNumberOfPeople();
int main() {
cout << numberOfPeople << endl;
numberOfPeople += 10; // <<== This triggers an error
}
答案 1 :(得分:0)
您可以使用的一种方法是将变量包装为函数中的静态变量。在代码的其余部分使用函数而不是变量。
#include <iostream>
int readFromStdin()
{
int n;
cin >> n;
return n;
}
// Wrap it arund in a function.
// int numberOfPeople; //Do not re-assign it after it first assign
int getNumberOfPeople()
{
// Initialize by reading from stdin.
static int numberOfPeople = readFromStdin();
returnn numberOfPeople;
}
int main(){
// Use the function instead of the variable.
getNumberOfPeople();
}
答案 2 :(得分:0)
如果你有不同的方法来初始化变量,你可以想出这样的东西:
struct {
int value() const { return _val; }
void init(int val) {
if(!_set) _val = val;
}
private:
int _val;
bool _set = false;
} numberOfPeople;
现在,使用该变量的每个人都应该在使用它之前调用init
以确保它已初始化。