【问题标题】:Static or nonstatic getters/setters for static class variable in C++C++ 中静态类变量的静态或非静态 getter/setter
【发布时间】: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


【解决方案1】:
  1. 如果没有声明对象,您可以调用静态方法
  2. 您的代码更具可读性:如果您有一个静态方法 getA,您就知道 A 是静态的

【讨论】:

  • 是的,这是真的。在我提出问题的上下文中,我永远不需要在没有任何声明实例的情况下调用静态方法,所以我没有考虑这一点。但是,是的,这是一个很好的观点。
  • 静态方法修改静态成员,因此当您阅读 .h 时,您会看到一个静态方法 getA,因此您知道 A 是静态的
【解决方案2】:

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

我假设您确实需要它们;如果您的静态数据成员只是私有的,因为您需要确保其值符合某些标准,就会出现这种情况。如果它涉及更复杂的逻辑,您可能需要重新考虑您的界面。

【讨论】:

  • 你说的话听起来很有趣,虽然我不确定我是否完全理解第二段。我读它时说(除其他外)“如果A::X 是私有的唯一原因是确保其值符合某些标准”,那么我应该使getter/setter 非静态和虚拟。你是这个意思吗?如果是这样,我不明白你的意思。 (顺便说一句,我确实不需要覆盖它们。)
  • 不,如果您的静态数据成员可以采用任何值并且您不需要保持它与其他数据成员的一致性,您可以将其公开并删除您的 setter 和 getter。如果将其保持在 0.0 - 1.0 范围之外是您需要成员函数的唯一原因,请保持它们为静态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
相关资源
最近更新 更多