使成员函数中的静态变量与每个实例无关

时间:2019-03-07 16:13:28

标签: c++ function class static member

上课:

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分配内存。

编辑:

是的,您可以添加i作为实例变量,但是如果需要在各种(独立)函数中使用这些计数器,该怎么办?我希望将变量的范围仅限制为函数(“在成员函数中”)。如果需要各种计数器,向类中添加变量iccountercounter_2似乎很麻烦,不是吗?

2 个答案:

答案 0 :(得分:5)

class A
{
public:
    int i = 0;
    void foo(){
        ++i;
    }
};

是通常的方法:i现在是该类的成员变量。显然,您不想使用static

答案 1 :(得分:2)

在声明数据成员变得昂贵的情况下(需要很少使用的稀疏成员),实例独立集合(通常是关联的集合)可能会派上用场。 std::map类家族一无所知,可以用作OP的第一个推测。我们需要在A::foo中为每个访问的对象创建一个计数器,但是对于未访问的实例(即A实例未调用A::foo的实例)则不需要。这是我想到的最简单的第一个解决方案:

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

在未位于映射中的对象上调用std::map::operator[]时,默认情况下,关联值在已由分配器清零的内存位置中构造(简而言之,第一次计时器会自动初始化为0)。