C++ C+;中静态类变量的静态或非静态getter/setter+;
假设我有以下课程:C++ C+;中静态类变量的静态或非静态getter/setter+;,c++,class,static,setter,getter,C++,Class,Static,Setter,Getter,假设我有以下课程: 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)
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;
}
}
void A::setValue(常量双x){
#pragma-omp-critical
{
如果(x1.0)
//用于引发异常的自定义宏调用
X=X;
}
}
双精度A::getValue(){
#pragma-omp-critical
{
返回X;
}
}
在我看来,无论是将这些getter和setter函数作为静态成员函数还是非静态成员函数添加到A
,都没有实际意义。是这样吗
在本例中,或者更一般地说,是什么原因使此类getter和setter函数成为类的静态或非静态成员,这些类的静态成员由它们控制访问
我建议您尝试在接口和实现之间划分您的推理。如果您需要在没有实例化类的实例时调用setter/getter,请将它们设置为静态。如果您可能需要覆盖它们,请使它们成为非静态和虚拟的
我想你们两个都需要;如果您的静态数据成员是私有的,这将是一种情况,因为您需要确保其值满足某些条件。如果涉及到更复杂的逻辑,您可能需要重新考虑您的接口。是的,确实如此。在我提出问题的上下文中,我永远不需要在没有任何声明实例的情况下调用静态方法,所以我没有考虑这个问题。但是,是的,这是一个很好的观点。静态方法修改静态成员,因此当您阅读.h时,您会看到一个静态方法getA,这样您就知道a是静态的。为静态成员使用非静态访问器方法可能会令人困惑。如果将在多线程环境中使用,请创建静态访问器并保护对数据的访问(例如,使用互斥)。静态方法也可以像a.modifyStaticData()@TimDave这样的非静态方法一样调用,假设是单个共享内存线程化环境,并且假设只有OpenMP用于线程化,那么实际上,关键部分的用途与使用互斥锁相同(在上面的示例中)。对吧?我相信是的,虽然我对你不太熟悉omp@TimDave好吧,很公平。你的观点很好。你说的话听起来很有趣,尽管我不确定我是否完全理解了第二段。我读到它的意思是(除其他外)“如果
A::X
是私有的唯一原因是为了确保其值满足某些标准”,那么我应该使getter/setter成为非静态和虚拟的。这就是你的意思吗?如果是这样,我不明白你的意思。(顺便说一句,我永远不需要重写它们。)不,如果静态数据成员可以采用任何值,并且不需要与其他数据成员保持一致,则可以将其公开并删除setter和getter。如果将其保持在0.0-1.0范围之外是您需要成员函数的唯一原因,请将其保持为静态。