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

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

static classA myObject;

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

}

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

5 ответов

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


Для примера смотрите здесь: C++ Meyers singleton неопределенная ссылка

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

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

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

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

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

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

Другие вопросы по тегам