Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+;中静态类变量的静态或非静态getter/setter+;_C++_Class_Static_Setter_Getter - Fatal编程技术网

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函数成为类的静态或非静态成员,这些类的静态成员由它们控制访问

  • 如果未声明任何对象,则可以调用静态方法
  • 您的代码更具可读性:如果您有一个静态方法getA,您就知道a是静态的

  • 我建议您尝试在接口和实现之间划分您的推理。如果您需要在没有实例化类的实例时调用setter/getter,请将它们设置为静态。如果您可能需要覆盖它们,请使它们成为非静态和虚拟的


    我想你们两个都需要;如果您的静态数据成员是私有的,这将是一种情况,因为您需要确保其值满足某些条件。如果涉及到更复杂的逻辑,您可能需要重新考虑您的接口。

    是的,确实如此。在我提出问题的上下文中,我永远不需要在没有任何声明实例的情况下调用静态方法,所以我没有考虑这个问题。但是,是的,这是一个很好的观点。静态方法修改静态成员,因此当您阅读.h时,您会看到一个静态方法getA,这样您就知道a是静态的。为静态成员使用非静态访问器方法可能会令人困惑。如果将在多线程环境中使用,请创建静态访问器并保护对数据的访问(例如,使用互斥)。静态方法也可以像a.modifyStaticData()@TimDave这样的非静态方法一样调用,假设是单个共享内存线程化环境,并且假设只有OpenMP用于线程化,那么实际上,关键部分的用途与使用互斥锁相同(在上面的示例中)。对吧?我相信是的,虽然我对你不太熟悉omp@TimDave好吧,很公平。你的观点很好。你说的话听起来很有趣,尽管我不确定我是否完全理解了第二段。我读到它的意思是(除其他外)“如果
    A::X
    是私有的唯一原因是为了确保其值满足某些标准”,那么我应该使getter/setter成为非静态和虚拟的。这就是你的意思吗?如果是这样,我不明白你的意思。(顺便说一句,我永远不需要重写它们。)不,如果静态数据成员可以采用任何值,并且不需要与其他数据成员保持一致,则可以将其公开并删除setter和getter。如果将其保持在0.0-1.0范围之外是您需要成员函数的唯一原因,请将其保持为静态。