сделать статические переменные в функциях-членах независимыми для каждого экземпляра - PullRequest
2 голосов
/ 07 марта 2019

Учитывая класс:

class A {
    Public:
        void foo() {
            static int i;
            i++;
        }
};

Как бы вы изменили его, чтобы запретить i переключаться между экземплярами, следуя этому примеру:

A o1, o2, o3;
o1.foo(); // i = 1
o2.foo(); // i = 1
o3.foo(); // i = 1
o1.foo(); // i = 2

т.е. выделить память для i на каждый экземпляр.

EDIT:

Да, вы можете добавить i в качестве переменной экземпляра, но что если вам понадобятся эти счетчики в различных (независимых) функциях? Я ищу ограничить область действия переменной только функцией ("в функциях-членах") . Было бы неловко добавлять переменные, такие как i, c, counter, counter_2, если вам нужны различные счетчики, не так ли?

Ответы [ 2 ]

5 голосов
/ 07 марта 2019
class A
{
public:
    int i = 0;
    void foo(){
        ++i;
    }
};

является нормальным способом: i теперь является переменной-членом класса. Очевидно, вы не хотите использовать static.

2 голосов
/ 07 марта 2019

В тех случаях, когда объявление элементов данных становится дорогостоящим (необходимость в редких элементах, которые используются не так часто), может пригодиться коллекция с независимым экземпляром, обычно ассоциативная.Больше ничего не зная о намерениях ОП, семейство классов std::map можно использовать как первое предположение.Нам нужно иметь один счетчик на посещаемый объект в A::foo, но не для не посещенных экземпляров (то есть A экземпляров, не вызывающих A::foo).Это было самое простое первое решение, которое я придумал:

void A::foo(){
    static std::map<A*,std::size_t> i;
    ++i[this];
    //...
};

При вызове std::map::operator[] для объекта, отсутствующего на карте, соответствующее значение по умолчанию создается в ячейке памяти, уже обнуленной распределителем.(короче говоря, 1-таймеры автоматически инициализируются на 0).

...