我的目标是在类中的值发生更改时触发事件接收器。我的解决方案是使用 get 和 set 函数。但是,我不希望在读取这些值时出现任何性能问题。在下面的类中:
class Vertex {
public:
const double& GetX() { return _x; } // should inline automatically
const double& GetY() { return _y; } // ' ' ' '
void SetX(const double& x); // complex stuff in source file
void SetY(const double& y); // ' ' ' '
private:
double _x, _y;
}
我将 getter 的定义放在头文件中,因为这应该允许它们被内联。
我的问题是:有没有什么方法可以在更改值时自动调用函数,而不需要我在头文件中包含函数定义?或者是否有一个可见性级别允许任何人读取数据,但只有类本身可以修改它?还是别的什么?
我知道另一种方法是手动调用更新函数,但这看起来很难看:
vertex.X = 5;
vertex.Update();
提前谢谢你。
编辑:
到目前为止,我听到了一些很好的答案。解决方案取决于您的目标:
- 简单:getter 和 setter;虽然不是很干净。
- 清洁:属性类(或代理);不过,实现运营商并不那么容易。
但是,效率呢?
我刚刚为我之前推测的单独的读/写访问权限制定了一个很好的技巧:
class Vertex {
public:
Vertex(double x, double y)
: _x(x), _y(y), X(_x), Y(_y) { } // defined here for readability
void SetX(double x) { _x = x; update(); } // defined here for readability
void SetY(double y) { _y = y; update(); } // update would be the callback
const double& X, Y;
private:
double _x, _y;
}
最佳答案
如果您要寻找的只是干净的,那么最干净的方法可能就是拥有一个“属性”对象,就像在 C# 中一样:
template<typename T>
class Property {
public:
Property(std::function<void(T)> callback) : data(), callback(callback) { }
Property& operator=(const T& newvalue) {
data = newvalue;
callback(data);
return *this;
}
operator T() const {
return data;
}
private:
T data;
std::function<void(T)> callback;
};
class Vertex {
public:
Vertex() : X(&xcallback), Y(&ycallback) { }
Property<double> X, Y;
};
(为了简洁起见,函数是内联的,如果你想的话,你可以将它们移出。)然后你可以做
Vertex v;
v.X = 4;
v.Y = 2.3443;
并且每次赋值时,都会调用相应的回调。你可以使用 v.X
和 v.Y
来代替你使用 double
的地方,所以它们的行为就像普通的 double
s(除了你必须实现 -=
、+=
等)。
关于C++ - 更改成员值时调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9144819/