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

托马斯·阿图罗·埃雷拉·卡斯特罗

给定班级:

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到类,如果你需要不同的柜台,岂不?

红波

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章