如何在首次分配变量后冻结变量?

时间:2017-12-22 22:41:17

标签: c++

请在此问题中假设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那样使用的符号?

3 个答案:

答案 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以确保它已初始化。