Проблема с локальными статическими переменными. Соответствует ли это стандарту?
Эпиграф: То ли лыжи не едут, то ли я ...
Заметил странную особенность, мне кажется, это неправильное поведение компилятора, но возможно, я плохо знаю стандарт с++. Прошу поделиться мыслями.
Я объявил некоторый класс A. В этом классе A есть функция func, в теле которой объявлены статические переменные.
void A::func()
{
static int a = 0;
static int b = 0;
...
}
Затем я создал классы B, C, D являющиеся наследниками класса A, а так же объекты классов B, C, D.
Именно здесь и начались проблемы. Как выяснилось (после 2 часов отладки вперемежку с нецензурной руганью) статические переменные a, b оказались одними и теми же (хранятся по одному адресу) для всех объектов классов B, C, D.
Разве они не должны быть в каждом объекте класса разными?
Как выяснилось (после 2 часов отладки вперемежку с нецензурной руганью) статические переменные a, b оказались одними и теми же (хранятся по одному адресу) для всех объектов классов B, C, D.
Разве они не должны быть в каждом объекте класса разными?
Начнём с того, что эти переменные вообще не принадлежат объекту. Это локальные переменные функции. А функция у вас определена одна единственная, A::func. B и C унаследовали это определение, своих функций func у них нет.
Нет, ничего не изменится: функция у вас одна, вне зависимости от того, сколько объектов вы создадите.
Если вы хотите переменную поместить в объект, то добавьте поле в определение класса.
Ключевое слово static как раз предназначено для того чтобы переменная вела себя как глобальная. Почему бы вам не объявить обычный член класса А, тогда он будет принадлежать экземпляру класса?
Да проблему я уже давно решил именно таким способом. Просто не ожидал, что статическая переменная будет себя вести как глобальная настолько, я думал что у каждого объекта класса она будет своя, ведь объявлена она не в классе, а в функции. Мне просто было нужно чтобы она сохраняла свое значение от вызова к вызову, а так как в других функциях класса она не использовалась решил ее объявить в теле функции.