local static variable и несколько экземпляров класса
От: Frostyland  
Дата: 29.07.05 05:18
Оценка:
Привет, народы!
Что-то я запутался в азах ...

Есть такой класс


class Test
{
public:
  Test(int i) : idx(i){}
  int idx;
  int f()
  {
    static int step;
    return step++;
  }
};


Подразумевается, что локальная статическая переменная step статична для метода f(),
соответственно, для разных экземпляров этого класса step будут различными.

Однако в результате выходит, что нет!


int main(int argc, char* argv[])
{

  Test a(0);
  Test b(1);

  printf("object %d , result of f() = %d\n", a.idx, a.f());
  printf("object %d , result of f() = %d\n\n", b.idx, b.f());

  system("pause");

  return 0;
}


Тест выводит


object 0 , result of f() = 0
object 1 , result of f() = 1


что свидетельствует о разделяемом характере переменной step.

Соответственно, такой механизм реализации счетчиков ограничен паттерном SINGLETON.
С уважением, В.Куликов
Re: local static variable и несколько экземпляров класса
От: gbt Россия  
Дата: 29.07.05 05:26
Оценка:
Hello, Frostyland, you wrote:

>
> class Test
> {
> public:
>   Test(int i) : idx(i){}
>   int idx;
>   int f()
>   {
>     static int step;
>     return step++;
>   }
> };
>


> Подразумевается, что локальная статическая переменная step статична для метода f(),

> соответственно, для разных экземпляров этого класса step будут различными.
Неверно, локальная статическая переменная создается для какаждого экземпляра
генерируемой компилятором функции. Компилятор генерирует единственный экземпляр
кода функции f (а метод — частный случай функции) для всех экземпляров класса
Test, что и подтверждает пример.

> Соответственно, такой механизм реализации счетчиков ограничен паттерном SINGLETON.

Если вы хотите использовать счетчики на уровне экземпляров классов, то
используйте member data.

--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
Re[2]: local static variable и несколько экземпляров класса
От: Frostyland  
Дата: 29.07.05 05:49
Оценка:
Здравствуйте, gbt, Вы писали:

gbt>Если вы хотите использовать счетчики на уровне экземпляров классов, то

gbt>используйте member data.

Да, это самый правильный выход.

Вообще, к чему это я завел — любую сентенцию, вычитанную даже в уважаемой книжке, необходимо проверять.
С уважением, В.Куликов
Re[3]: local static variable и несколько экземпляров класса
От: Sergey Россия  
Дата: 29.07.05 09:03
Оценка:
> gbt>Если вы хотите использовать счетчики на уровне экземпляров классов, то
> gbt>используйте member data.
>
> Да, это самый правильный выход.
>
> Вообще, к чему это я завел — любую сентенцию, вычитанную даже в уважаемой
> книжке, необходимо проверять.

А что за книжка, в которой такое пишут? Не Шилдт писал случайно?
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.