在每个实例中,使成员函数中的静态变量独立

making static variables in member functions independent for each instance

本文关键字:函数 静态 独立 变量 成员 实例      更新时间:2023-10-16

给定类:

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之类的变量的变量似乎很尴尬,如果您需要各种计数器,它是否不是吗?

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

是正常的方式:i现在是类的成员变量。显然您不想使用static

在声明数据成员变得昂贵的情况下(需要经常使用的稀疏成员),实例的固定集合(通常是关联的成员)可能会派上用场。std::map班级家庭可以用作第一个猜测,对OP的意图一无所知。我们需要在A::foo中每个访问的对象有一个计数器,但对于未访问的实例,我们不需要一个计数器(即A未调用A::foo的实例)。这是我想到的最简单的第一个解决方案:

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

在不在地图中的对象上拨打std::map::operator[]时,关联的值是在分配器已经归零的内存位置中构建的默认值(简而Div>