Имеет ли смысл объявлять статическую переменную в функции класса, где объект является статическим
Допустим, мой класс, скажем, у меня есть
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).