Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 强制类方法使用其私有成员的setter/getter_C++_Multithreading_Mutex_Getter Setter - Fatal编程技术网

C++ 强制类方法使用其私有成员的setter/getter

C++ 强制类方法使用其私有成员的setter/getter,c++,multithreading,mutex,getter-setter,C++,Multithreading,Mutex,Getter Setter,下面是一个非常简单的类示例。这个类在多线程系统中使用,我想确保对x的每次访问(也在其他开发人员对该类的未来扩展中)都将受到互斥的保护。一种方法是将互斥体放在setter和getter中,并从类方法强制使用它们,这意味着任何直接访问都将生成编译错误。可能吗 class Myclass { public: int getX() const { boost::mutex::scoped_lock lock(_lock); return _x; } vo

下面是一个非常简单的类示例。这个类在多线程系统中使用,我想确保对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;
};

你不能直接这么做

一种方法是创建一个基本
类MyBaseClass
,该类将成员
\ux
标记为
private
,并在
MyBaseClass
中对访问者以及互斥对象进行编码

然后定义
class Myclass:public MyBaseClass


但在您的特定情况下,使用相当简单的
std::atomic\ux
可能就足够了。

您不能阻止类访问其成员,这是有意义的;你如何允许塞特和盖特这样做

但是你有一个很好的保护属性的语义概念。我建议创建一个像
locked\u variable
这样的模板类,它封装了这样一个属性。原始属性将是私有的,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;
}
模板
类锁定属性{
公众:
locked_属性(boost::mutex&lock):_lock(lock){}
无效集(常数和T值){
boost::mutex::作用域锁定(锁定);
_val=值;
}
//您返回一个副本,这里可能应该使用引用或常量引用
不明白{
boost::mutex::作用域锁定(锁定);
返回值;
}
私人:
boost::互斥锁和u锁;
T值;
}

然后在
MyClass
中使用它。根据您的需要,也许移动设置器是合适的。

我删除了C标签,方法是一个仅在C++中发现的特性。下次请仔细标记。(没有“Stackoverflow暗示它”不是一个很好的借口:P)这甚至是你想做的事情吗?如果您的代码执行比
get/set
成员更复杂的操作,那么即使是简单的计算也不会是线程安全的,例如
set_y(get_x()*get_x())将y设置为x的平方。即使您的方法可以实现,也不是线程安全的。