跨类的多个实例调用一次函数

时间:2018-04-05 05:58:42

标签: c++

我一直在寻找一段时间,但似乎无法找到答案 所以,如果我有一个类的几个实例,我如何只从该类的所有实例调用一次函数?
例如,如果我在名为myFunc()的类中有一个名为myClass的函数,并且该类的两个实例名为class1class2,那么 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

2 个答案:

答案 0 :(得分:2)

您可以通过

实现这一目标
  • 在类声明
  • 中使用static关键字引入类变量
  • 使用初始化
  • 在(单独)代码文件中定义类变量
  • 在函数内部检查,如果0输出1则为0
  • 之后增加(或设置为非零)
  • 使用同步机制时要小心,以防调用可能来自不同的上下文/线程/任务/进程(适用于您的环境)

(如果您展示了使用静态变量的尝试并解释了您遇到的问题,可能会更加详细。)

答案 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变量 您应该使用某种机制来保证您的代码是线程安全的。