【发布时间】:2014-01-22 05:05:23
【问题描述】:
假设我有以下课程:
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 函数成为类的静态或非静态成员,它们控制对它们的静态成员的访问?
【问题讨论】:
-
对静态成员使用非静态访问器方法可能会造成混淆。如果这将在多线程环境中使用,请使用静态访问器并保护对数据的访问(例如,使用互斥锁)。静态方法也可以像 a.modifyStaticData() 之类的非静态方法一样调用
-
@TimDave 假设一个共享内存线程环境,并假设仅 OpenMP 用于线程,那么临界区实际上与使用互斥锁的目的相同(在上面的示例中)。对吗?
-
我相信是的,虽然我对omp不太熟悉
-
@TimDave 好的,很公平。你的观点很好。
标签: c++ class static setter getter