C++ 强制类方法使用其私有成员的setter/getter
下面是一个非常简单的类示例。这个类在多线程系统中使用,我想确保对x的每次访问(也在其他开发人员对该类的未来扩展中)都将受到互斥的保护。一种方法是将互斥体放在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
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的平方。即使您的方法可以实现,也不是线程安全的。