#include <stdio.h>
void func() {
static int x = 0; // x is initialized only once across three calls of
// func()
printf("%d\n", x); // outputs the value of x
x = x + 1;
}
int main(int argc, char * const argv[]) {
func(); // prints 0
func(); // prints 1
func(); // prints 2
// Here I want to reinitialize x value to 0, how to do that ? <-- this line
return 0;
}
В приведенном выше коде, после вызова func () 3 раза, я хочу повторно инициализировать x
в ноль. Есть ли способ, чтобы повторно инициализировать его до 0?
Вы хотите функцию всегда сбросить счетчик после трех вызовов? или вы хотите, чтобы звонящий сбрасывал счет в произвольные моменты времени?
Если это первое, вы можете сделать это так:
void func() {
static int x = 0;
printf("%d\n", x);
x = (x + 1) % 3;
}
Если это последнее, использование локальной статической переменной, вероятно, является плохим выбором; вместо этого вы можете использовать следующий дизайн:
class Func
{
int x;
// disable copying
public:
Func() : x(0) {}
void operator() {
printf("%d\n", x);
x = x + 1;
}
void reset() {
x = 0;
}
};
Func func;
Вы должны сделать его не подлежащим копированию, чтобы избежать двух объектов, увеличивающих два разных счетчика (или сделать его одноэлементным), или сделать счетчик статическим элементом, чтобы каждый объект увеличивал один и тот же счетчик. Теперь вы используете это так:
int main(int argc, char * const argv[]) {
func(); // prints 0
func(); // prints 1
func(); // prints 2
func.reset();
return 0;
}
Ты не можешь Это локальная статическая переменная, которая невидима снаружи func()
,
Вы можете использовать:
Вы можете иметь func()
присвойте адрес переменной указателю, который виден снаружи func()
,
Или вы можете иметь специальный параметр, который вы можете передать func()
сказать ему, чтобы сбросить переменную.
Но на самом деле, весь смысл декларации x
внутри func()
это сделать его видимым только внутри тела func()
, Если вы хотите иметь возможность изменить x
определите это где-нибудь еще. Поскольку вы пишете C ++, это, вероятно, имеет смысл для x
быть статическим членом некоторого класса.