强制类方法使用自己私有成员的setter/getter
Forcing class methods use setter/getter of its own private member
下面是一个非常简单的类示例。这个类是在多线程系统中使用的,我想确保对_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是合适的。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- 常量成员和没有setter的私有成员之间有什么区别
- 如何在没有setter的情况下设置类内部类的成员变量?
- 在不编写显式 setter 的情况下修改私有类数据成员的便捷方法是什么?模板有用吗?
- 有没有办法在没有括号的情况下在C++中调用成员的getter/setter?
- 没有默认构造函数的对象成员的 wig setter
- 如何为数组成员变量声明 getter/setter
- 如何在 setter 方法中设置 boost::optional 成员变量的值?
- 在 c++ 中确定具有相同变量名的成员的 setter 的行为
- 绑定C++成员变量:getter/setter 或原始指针
- 如何使用构造函数来代替setter成员函数
- 强制类方法使用自己私有成员的setter/getter
- 如何为类成员变量编写setter
- c++类中成员setter /getter的适当设计