Имеет ли смысл объявлять статическую переменную в функции класса, где объект является статическим - PullRequest
1 голос
/ 07 февраля 2012

Допустим, мой класс, скажем, у меня есть

static classA myObject;

void classA::update(int elapsed)
{
  static int sumElapsed = 0;
  sumElapsed+= elapsed;

}

Кажется, мои вопросы довольно сложны для понимания.Но если мы говорим, что myObject является синглтоном класса A.Есть ли разница между локальным статическим int sumElapsed и закрытым членом int sumElapsed класса A, за исключением области, в которой они могут получить доступ.

Ответы [ 5 ]

3 голосов
/ 07 февраля 2012

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


Пример см. Здесь: c ++ синглтон Майерса, неопределенная ссылка

Кстати, если вам интересно: Действительно ли синглеты настолько плохи?

0 голосов
/ 07 февраля 2012

Вы должны использовать статический класс для хранения методов, которые не связаны с конкретным объектом.При этом используйте статический класс для хранения только статических членов, которые не могут быть созданы объектами и не должны быть перезаписаны.

0 голосов
/ 07 февраля 2012

Конечно. Если sumElapsed не является статическим, оно будет перезаписываться при каждом вызове функции; как это не так. Тот факт, что classA::update сам по себе статичен, не имеет значения; просто подумайте, если это глобальная функция (например, в C).

0 голосов
/ 07 февраля 2012

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

В общем, помните, что если вы ставитеСтатический член в классе или в функции, он все еще эффективно реализует анти-шаблон Singleton !

0 голосов
/ 07 февраля 2012

Если вы не хотите, чтобы sumElapsed перезаписывалось, тогда да, но кажется, что было бы более целесообразно, чтобы sumElapsed инкапсулировался в classA как статическая переменная.

...