Войти
ПрограммированиеФорумОбщее

Если в классе нужна переменная, работающая как обычная статическая

Страницы: 1 2 Следующая »
#0
0:21, 27 фев. 2016

Добрый день, уважаемые эксперты!

Подскажите пожалуйста, если нужна переменная в классе, со свойствами обычной статической, то как ее объявить?
То есть, обычная static работает так, что она инициализируется единожды в функции каким-то значение, впоследствии она может меняться, но при повторном вызове функции она не переинициализируется.
А как быть в случае классов, ведь переменная, объявляемая как static внутри класса, имеет значение "общая для всех экземпляров", а не то, что мне нужно?
Ну, допустим, объявлять ее в функциях-членах, ок, ну а способа объявить ее на весь класс нет?


#1
0:35, 27 фев. 2016

Кобактан
> но при повторном вызове функции она не переинициализируется.
даже если [функция] вызвана другим экземпляром класса, что также делает её "общая для всех экземпляров"

> а не то, что мне нужно
тебе подойдёт нестатическая : )

#2
0:46, 27 фев. 2016

Sh.Tac.
> тебе подойдёт нестатическая : )

Не подойдет. Вот например:

class Blabla {
public:
  int EnterCount;

  void CountEnters (void)
  {
    EnterCount = 0;
    EnterCount++;

    // .....
  
  }

}


Blabla Test;

Test.CountEnters ();
Test.CountEnters ();
Test.CountEnters ();

После трех или любого другого количества вызовов TestCountEnters(), переменная Test.EnterCount будет содержать 1, если я ничего не путаю, так?
При этом мы можем извне опросить переменную Test.EnterCount и убедиться в этом.

Можно сделать так:

class Blabla {


  void CountEnters (void)
  {
    static int EnterCount = 0;
    EnterCount++;

    // .....
  
  }

}


Blabla Test;

Test.CountEnters ();
Test.CountEnters ();
Test.CountEnters ();

Тогда после трех вызовов Test.CountEnters () переменная EnterCount будет равна 3, и вообще будет правильно отображать количество вызовов, но доступа к EnterCount извне у нас не будет. Не, ну можно, конечно, присваивать ее значение другой паблик-переменной, но это как-то коряво. Вот что мне нужно, чтобы была static-переменная, определенная не внутри функции-члена класса, а на весь класс.

#3
0:54, 27 фев. 2016

Я с трудом понял что тебе нужно, и то не уверен, что понял правильно. Но если понял правильно, то что мешает тебе инициализировать переменную нулем в конструкторе класса?

#4
1:04, 27 фев. 2016

1vanK
> Но если понял правильно, то что мешает тебе инициализировать переменную нулем в
> конструкторе класса?
Конкретно в данном упрощенном примере - ничего. Но что если мне нужно периодически сбрасывать счетчик в 0? В частности, мне нужно хранить в этой переменной время, начиная от момента первого вызова до определенного момента, а в определенный момент по условию сбрасывать это время в 0, чтобы начать отсчет заново.

#5
1:05, 27 фев. 2016

Sh.Tac.
> ну и опиши её как статический член класса

Но ведь в таком случае это будет одна-единственная переменная на все объекты класса, а мне нужна для каждого объекта своя переменная, при том статическая.

#6
1:07, 27 фев. 2016

> очевидно то, что делать это надо было в сpp до стандарта С++11/14

нужно писать код, который работает везде)

#7
1:12, 27 фев. 2016

Кобактан
ты всех запутал : )

пиши так

#include <iostream>

class Blabla {
public:
  int EnterCount = 0;

  void CountEnters (void)
  {
    EnterCount++;

    // .....
  
  }

};


int main() {
  // your code goes here
  
  Blabla Test;

  Test.CountEnters ();
  Test.CountEnters ();
  Test.CountEnters ();

  std::cout << Test.EnterCount << std::endl;
  return 0;
}

#8
1:27, 27 фев. 2016

Кобактан
> Конкретно в данном упрощенном примере - ничего. Но что если мне нужно
> периодически сбрасывать счетчик в 0? В частности, мне нужно хранить в этой
> переменной время, начиная от момента первого вызова до определенного момента, а
> в определенный момент по условию сбрасывать это время в 0, чтобы начать отсчет
> заново.

ну ты можешь задать переменной какое-то определенное значение, как признак того, что она еще не проиницализирована. Например -1. Или дополнительную переменную флаг

#9
1:38, 27 фев. 2016

Кобактан
> а в определенный момент по условию сбрасывать это время в 0, чтобы начать
> отсчет заново.
ну так и сбрасывай, в чем проблема? Надо извне сбрасывать - сделай метод для сброса.

#10
1:52, 27 фев. 2016

Кобактан
ты говоришь взаимоисключающие вещи, тебя никто не может понять, отвечу только на одно твое предложение вырванное из контекста:

> Вот что мне нужно, чтобы была static-переменная, определенная не внутри функции-члена класса, а на весь класс.
есть 3 вида статических переменных, ты видимо знаешь только об одном - статической переменной в функции
но есть и статическая переменная в классе, вот если переписать твой код из 2 поста

//h:
struct Blabla {
    static int EnterCount;

  void CountEnters (void)
  {
    EnterCount++;

    // .....
  
  }
}
//cpp:
int Blabla::EnterCount = 0;
и эта переменная доступна снаружи класса, она одна и инициализируется в первый момент обращения, также как статик переменная функции.
еще есть статические переменные снаружи классов и функций, они определены только в пределах единиц трансляции в которых обьявлены

#11
2:03, 27 фев. 2016

ashujon
> и эта переменная доступна снаружи класса, она одна и инициализируется в первый
> момент обращения
А мне нужна она нужна не одна для всех классов, а для каждого класса - своя.

#12
2:09, 27 фев. 2016

Кобактан
ты имеешь ввиду для каждого _экземпляра_ класса? тогда тебе нужна обычная не статическая переменная, и не говори больше слова "статическая" чтобы никого не путать

#13
12:02, 27 фев. 2016

Кобактан
> void CountEnters (void)
> {
> static int EnterCount = 0;
> EnterCount++;
> // .....
> }
Вообще-то эта переменная тоже будет общей для всех экземпляров класса и в этом плане ничем не будет отличаться от статического члена.

#14
13:11, 27 фев. 2016

Кобактан
Честно говоря я не понял что тебе нужно. Поэтому пример на бум. Не?

class Object
{
    private:
        static int globalID;

        int id;

    public:
        Object(void);
};

int Object::globalID=0;

Object::Object(void) : id(globalID++)
{
}
Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.