2016-05-31 2 views
0

Я ищу способ иметь переменную int, которая сохраняет значение при вызове метода. С этой точки зрения член класса будет хорош.Переменная C++, которая может быть изменена только одним способом, возможно?

Но я хотел бы, чтобы переменная int изменялась только в одном конкретном методе.

Как это сделать?

Я жестко о

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

Но я хотел бы var = 0; быть выполнена только в первый раз.

+4

как это 'var' только инициализируется один раз – vu1p3n0x

+9

Ваш код делает именно то, что вы хотите (инициализирует переменную один раз). Что за вопрос? – SergeyA

+1

1. Это не метод класса, 2. Я думаю, вы должны рассмотреть редизайн (многопоточность и т. Д.) –

ответ

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; 
}; 
0

вара только локально, если вы хотите, чтобы быть 0 в первый раз, функция возвращает сделать инициализируются - 1, или если 0 правильно, вы в порядке. Как и var, это видно только внутри my_method, поэтому, если вы хотите, чтобы это было видимым для всего класса, вы должны выставить его снаружи и использовать только my_method для изменения значения.

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).

0

Мне пока не хватает комментариев, но вы должны заметить, что Static не равен Constant.

Статические переменные сохраняют свое значение для ВСЕХ экземпляров класса, тогда как переменные константы могут иметь разные значения для каждого экземпляра (объекта) класса.

См. Этот вопрос для более подробного объяснения. What is the difference between a static and const variable?

Чтобы ответить на ваш вопрос напрямую, у вас не может быть истинного «глобального» vairable, который доступен только для редактирования из одного класса. Вместо этого вы должны рассмотреть ответ πάντα ῥε answer ИЛИ ждать, пока объявите константу, пока вы не узнаете значение, которое вы хотели бы присвоить ему.Например, я хочу, чтобы сохранить 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. 
Смежные вопросы