我一直在寻找一段时间,但似乎无法找到答案
所以,如果我有一个类的几个实例,我如何只从该类的所有实例调用一次函数?
例如,如果我在名为myFunc()
的类中有一个名为myClass
的函数,并且该类的两个实例名为class1
和class2
,那么
class1.myFunc()
应返回1,
class2.myFunc()
应返回0和
class1.myFunc()
应该返回0。
我该怎么做?
class myClass{
public:
myClass(){}
int myFunc(){
if (myFuncHasBeenCalled){
return 0;
}
else{
return 1;
}
}
}
myClass class1;
myClass class2;
class1.myFunc(); //would output 1
class2.myFunc(); //would output 0
class1.myFunc(); //would output 0
答案 0 :(得分:2)
您可以通过
实现这一目标static
关键字引入类变量
(如果您展示了使用静态变量的尝试并解释了您遇到的问题,可能会更加详细。)
答案 1 :(得分:1)
您有几个选项:想法是您需要一些可以独立于类实例访问的值。 static
是在所有情况下执行此操作的方法(除非它不是)。
我建议的方法是在成员函数中使用静态变量;这样可以避免污染类本身,并使您更容易在更新中维护一致的ABI以及一致的API。您可以很容易地对代码进行推理,因为您不允许其他任何内容访问该变量。
示例:
struct S {
int F() const {
static int n = 1;
if (n == 1) {
n = 0;
return 1;
}
return n;
}
};
一种似乎很受欢迎的替代方案是保留一个静态成员变量。这允许您执行与前一示例相同的操作,但是使得跨升级维护API和ABI变得更加困难。它还使得更难以推理您的代码并使其更容易引入错误 - 静态成员变量与全局变量没有太大区别。
示例:
struct S {
static int n;
int F() const {
if (n == 1) {
n = 0;
return 1;
}
return n;
}
};
int S::n = 1;
最糟糕的选择是使用全局变量。我不打算给你一个例子 - 不要这样做。如果您必须这样做(不要),请在.cpp
文件中的匿名命名空间中声明您的变量。
namespace {
int n = 0
}
另一种方法是使用静态成员函数。此函数完全独立于类的所有实例。实现中唯一的区别是您将static
添加到函数声明中 - 否则,您可以使用前两个选项。但在所有情况下都不可能实现。
如果需要使用变量在两个函数之间进行通信,则必须使用其中一个全局选项,并且不能在成员函数中使用静态变量。
在所有情况下,如果您未修改实例,则应标记您的函数const
。
您应该使用
您应该使用某种机制来保证您的代码是线程安全的。std::atomic
变量