只能在一种方法中更改的C ++全局变量可能吗?

时间:2016-05-31 20:18:45

标签: c++ c++11 c++14

我正在寻找一种方法,让一个int变量在方法调用中保持值。从这个角度来看,一个班级成员会很好。

但我希望只在一个特定方法中更改int变量。

我该怎么做?

我很苛刻

void MyClass::my_method(){
    static int var = 0;
    var++;
}

但是,我希望var = 0;仅在第一次执行。

4 个答案:

答案 0 :(得分:2)

void my_method(){
    static int var;
    var++;
}

这里的问题是,

    static int var;

仅在my_method()的本地范围内可见。

您可以根据my_method()之外的变量定义将其设为全局:

int var;
void my_method() {
    var++;
}

但每个人都可以看到var

更好的方法是将所有内容封装到一个类中:

class MyClass {
public:
     static void my_method() {
         var++;
     }
private:
    static int var = 0;
};

答案 1 :(得分:2)

您可以使用以下密钥访问模式:

struct Foo {
  void fun1();
  void fun2();

  static class Var {
    friend void Foo::fun1();
    int i = 0;
  public:
    int value() const { return i; }
  } var;
};

Foo::Var Foo::var;

void Foo::fun1() { var.i = 42; }

void Foo::fun2() { 
  // var.i = 42; // this will generate compile error cause fun2 doesn't have to var 
}

Live Demo

这样,只有在包装类Foo中声明为朋友的Var成员函数才能更改其私有成员变量(例如var.i)。

答案 2 :(得分:0)

var只是本地的,如果你希望在函数第一次返回时为0,则将其初始化为-1或者如果0恰到好处,你就可以了。因为var只在my_method中可见,所以如果你希望它对所有类都可见,你必须将它放在外面并仅使用my_method来修改值。

答案 3 :(得分:0)

我还没有足够的回复评论,但你应该注意到静态不等于常数。

静态变量为类的所有实例维护其值,而Constant变量对于类的每个实例(对象)可以具有不同的值。

请参阅此问题以获得更深入的解释。 What is the difference between a static and const variable?

要直接回答您的问题,您不能拥有只能从一个班级编辑的真正的“全球”版本。相反,您应该考虑πάνταῥεῖ的答案或等待声明常量,直到您知道要分配给它的值。例如,我想将X + 10存储到常量变量Y

int x = 5 //create variable

//Do whatever you need to do to get the value
function myFunction(){
    x = x + 10;
}

const int y = x; //now Y = 15 and cannot be changed.