强制 class 方法使用其私有成员的 setter/getter

Forcing class methods use setter/getter of its own private member

下面是一个非常简单的例子class。此 class 用于多线程系统,我想确保对 _x 的每次访问(以及其他开发人员对 class 的未来扩展)都将受到互斥锁的保护。这样做的一种方法是将互斥锁放在 setter 和 getter 中,并强制在 class 方法中也使用它们,这意味着,任何直接访问都会产生编译错误。可能吗?

class Myclass
{
public:
   int getX() const
   {
      boost::mutex::scoped_lock lock(_lock);
      return _x;
   }

   void setX(int x)
   {
      boost::mutex::scoped_lock lock(_lock);
      _x = x;
   }

   void foo()
   {
      //accessing _x; 
   }
private:
   mutable boost::mutex _lock;
   int _x;
};

你不能直接这样做。

一种方法是创建一个基础 class MyBaseClass,其中成员 _x 标记为 private,并在 [=13= 中对访问器和互斥对象进行编码].

然后定义class Myclass : public MyBaseClass

但在您的具体情况下,使用简单得多的 std::atomic<int> _x 可能就足够了。

您无法阻止 class 访问其成员,这是有道理的;你会如何让 setter 和 getter 做到这一点?

但是你有一个很好的保护语义概念属性。我建议制作一个模板 class,例如 locked_variable<T>,它封装了 属性。原来的 属性 将是私有的,而 setter 和 getter 将是 public.

类似于:

template <typename T>
class locked_property {
public:
  locked_property(boost::mutex& lock) : _lock(lock) {}

  void set(const &T value) {
    boost::mutex::scoped_lock lock(_lock);
    _val = value;
  }

  // you return a copy, maybe a reference or const ref should be used here
  T get() {
    boost::mutex::scoped_lock lock(_lock);
    return _val;
  }

private:
  boost::mutex& _lock;
  T val;
}

然后在MyClass中使用它。根据您的需要,move-setter 可能是合适的。