使成员函数中的静态变量独立于每个实例
making static variables in member functions independent for each instance
鉴于 class:
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
添加为实例变量,但是如果您在各种(独立)函数中需要这些计数器怎么办?我希望 将变量的范围仅限于函数 ("in member functions")。 i
、c
、counter
、counter_2
这样的变量,如果需要各种计数器的话,在class中加上变量,会不会显得很别扭?
class A
{
public:
int i = 0;
void foo(){
++i;
}
};
是正常的方式:i
现在是class的一个成员变量。显然你不想使用 static
.
在声明数据成员变得昂贵的情况下(需要不经常使用的稀疏成员),实例独立集合——通常是关联集合——可能会派上用场。对 OP 的意图一无所知,std::map
家族 类 可以用作第一个推测。我们需要为 A::foo
中的每个已访问对象设置一个计数器,但未访问实例(即未调用 A::foo
的 A
实例)则不需要。这是我想到的最简单的第一个解决方案:
void A::foo(){
static std::map<A*,std::size_t> i;
++i[this];
//...
};
在不在映射中的对象上调用 std::map::operator[]
时,关联值默认构造在已由分配器置零的内存位置(简而言之,第 1 个计时器自动初始化为 0)。
鉴于 class:
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
添加为实例变量,但是如果您在各种(独立)函数中需要这些计数器怎么办?我希望 将变量的范围仅限于函数 ("in member functions")。 i
、c
、counter
、counter_2
这样的变量,如果需要各种计数器的话,在class中加上变量,会不会显得很别扭?
class A
{
public:
int i = 0;
void foo(){
++i;
}
};
是正常的方式:i
现在是class的一个成员变量。显然你不想使用 static
.
在声明数据成员变得昂贵的情况下(需要不经常使用的稀疏成员),实例独立集合——通常是关联集合——可能会派上用场。对 OP 的意图一无所知,std::map
家族 类 可以用作第一个推测。我们需要为 A::foo
中的每个已访问对象设置一个计数器,但未访问实例(即未调用 A::foo
的 A
实例)则不需要。这是我想到的最简单的第一个解决方案:
void A::foo(){
static std::map<A*,std::size_t> i;
++i[this];
//...
};
在不在映射中的对象上调用 std::map::operator[]
时,关联值默认构造在已由分配器置零的内存位置(简而言之,第 1 个计时器自动初始化为 0)。