强制 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 可能是合适的。
下面是一个非常简单的例子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 可能是合适的。