假设我有以下课程:
class A {
private:
static double X;
};
double A::X = 0.0;
变量A::X
确实应该是静态的,因为A
的所有实例在我所关注的上下文中必须共享A::X
的相同值。
现在,我的问题是是否为A::X
静态创建getter和setter函数。它们的定义如下:
void A::setValue(const double x) {
#pragma omp critical
{
if(x<0.0||x>1.0)
// custom macro call to raise exception
X = x;
}
}
double A::getValue() {
#pragma omp critical
{
return X;
}
}
在我看来,我是否将这些getter和setter函数添加到A
作为静态或非静态成员函数绝对没有实际区别。这是对的吗?
在这个例子中,或者更一般地说,有什么理由可以选择将这样的getter和setter函数作为类的静态或非静态成员来控制其访问的静态成员?
答案 0 :(得分:5)
答案 1 :(得分:2)
我建议你尝试在界面和实现之间分配你的推理。如果在没有实例化类的实例时需要调用setter / getter,请将它们设置为静态。如果您可能需要覆盖它们,请将它们设置为非静态和虚拟。
我假设你确实需要他们两个;如果您的静态数据成员是私有的,那么就是这种情况,因为您需要确保其值符合某些条件。如果涉及更复杂的逻辑,您可能需要重新考虑您的界面。