Привет, народы!
Что-то я запутался в азах
...
Есть такой класс
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.
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
> gbt>Если вы хотите использовать счетчики на уровне экземпляров классов, то
> gbt>используйте member data.
>
> Да, это самый правильный выход.
>
> Вообще, к чему это я завел — любую сентенцию, вычитанную даже в уважаемой
> книжке, необходимо проверять.
А что за книжка, в которой такое пишут? Не Шилдт писал случайно?
Posted via RSDN NNTP Server 1.9
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.