鉴于课程:
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
作为实例变量,但是如果你需要在各种(独立)函数中使用这些计数器呢?我期待将变量的范围仅限于函数(“在成员函数中”)。如果你需要各种计数器,那么在课堂上添加i
,c
,counter
,counter_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)。
class A
{
public:
int i = 0;
void foo(){
++i;
}
};
这是正常的方式:i
现在是该类的成员变量。显然你不想使用static
。