C++ - 更改成员值时调用函数

标签 c++ events encapsulation getter-setter vertex

我的目标是在类中的值发生更改时触发事件接收器。我的解决方案是使用 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.Xv.Y 来代替你使用 double 的地方,所以它们的行为就像普通的 doubles(除了你必须实现 -=+= 等)。

关于C++ - 更改成员值时调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9144819/

相关文章:

java - 关于更改文本事件的 JLabel

jQuery 绑定(bind)事件触发事件

ios - 只读公共(public),读写私有(private)属性(property)

c++ - 从派生类方法到基类成员的友元

c++ - openCV:从矩阵绘制颜色图

python - 确定振荡信号上的事件位置

c++ - C++中的小型可读方案解释器?

c++ - friend 模板运算符<<无法访问类的保护成员

c++ - 我在返回过程中遇到错误 255

c++ - ofstream中可以设置 "eof"吗?