强制类方法使用自己私有成员的setter/getter

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

本文关键字:成员 setter getter 类方法 自己      更新时间:2023-10-16

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

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,并在MyBaseClass中编码访问器和互斥对象。

然后定义class Myclass : public MyBaseClass

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

你不能阻止class访问它的成员,这是有意义的;如何允许setter和getter这样做呢?

但是你有一个很好的保护属性的语义概念。我建议创建一个像locked_variable<T>这样的模板类来封装这样的属性。原来的属性是private, 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是合适的。