关于c ++:在每个实例独立的成员函数中创建静态变量

making static variables in member functions independent for each instance

给定类:

1
2
3
4
5
6
7
class A {
    Public:
        void foo() {
            static int i;
            i++;
        }
};

您将如何更改它以防止i在以下示例中的实例之间发生更改:

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

即在每个实例上为i分配内存。

编辑:

是的,您可以将i添加为实例变量,但是如果您在各种(独立)函数中需要这些计数器呢?我希望将变量的范围仅限于函数("在成员函数中")。如果你需要不同的计数器,那么在这个类中添加诸如iccountercounter_2之类的变量会很难,不是吗?


1
2
3
4
5
6
7
8
class A
{
public:
    int i = 0;
    void foo(){
        ++i;
    }
};

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


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

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

在对不在映射中的对象调用std::map::operator[]时,关联的值默认在分配器已经归零的内存位置中构造(简而言之,第一个计时器自动初始化为0)。