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添加为实例变量,但是如果您在各种(独立)函数中需要这些计数器呢?我希望将变量的范围仅限于函数("在成员函数中")。如果你需要不同的计数器,那么在这个类中添加诸如i、c、counter、counter_2之类的变量会很难,不是吗?
- …这就是实例变量的用途
- static变量是您在不需要唯一实例时所做的操作。如果您希望为每个class实例保留一个状态,那么您需要将该状态存储为class的成员。
- 投票赞成的这个问题很奇怪,但并不一定很糟糕。
- 考虑一下如果你想这样做会发生什么:成员中的"static"变量必须被存储在对象实例的一部分中,以实例特定,但是在C++中,你通常声明该类与成员实现分开,并且类声明必须足以允许编译器计算。对象的大小。由于"static"变量是在方法内部声明的,而不是在类定义中声明的,因此只能查看定义的代码不知道其大小。因此,我们有一个矛盾,这不可能以这种方式运作。
- 相关:stackoverflow.com/questions/6223355/…
- 关于:如果需要不同的计数器,向类中添加变量(如i、c、counter、counter_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)。
- @Ramghadiyaram程序讨厌打字??
- 投赞成票。这是一个优雅的,这是特别相关的后续行动的编辑。把EDOCX1[1]作为关键?当然,如果A和随后的foo调用有许多实例化,那么地图可能会变大。但这是可修复的,尽管我可以想象开销与简单方法的单独类成员相当。
- @芭丝谢芭同意了。但是关联容器旨在实现稀疏矩阵。此外,我只是暗示"std::map"的接口。但同样,只有当很少使用"a::foo"与"a"实例的数量相比时,任何类似的方法才有用。