繁体   English   中英

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

[英]making static variables in member functions independent for each instance

鉴于课程:

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

在声明数据成员变得昂贵的情况下(需要经常不使用的稀疏成员),一个实例独立集合 - 通常是一个关联集合 - 可能会派上用场。 对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)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM