私の目標は、クラスで値が変更されたときにイベント レシーバーを起動することです。これに対する私の解決策は、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;
}
ゲッターの定義をヘッダー ファイルに入れました。これにより、ゲッターをインライン化できるはずです。
私の質問は次のとおりです。値が変更されたときに、ヘッダー ファイルに関数定義を含める必要がない関数を自動的に呼び出す方法はありますか? それとも、誰でもデータを読み取ることができる可視性レベルがありますが、クラス自体だけがデータを変更できますか? それとも何か他のものですか?
別の方法として update 関数を手動で呼び出す方法があることはわかっていますが、それは見苦しく見えます。
vertex.X = 5;
vertex.Update();
前もって感謝します。
編集:
これまでのところ、いくつかの素晴らしい答えを聞いています。解決策は、目的によって異なります。
- 簡単: ゲッターとセッター。あまりきれいではありませんが。
- クリーン: プロパティ クラス (またはプロキシ); ただし、演算子の実装はそれほど簡単ではありません。
しかし、効率はどうでしょうか。
以前に推測した、個別の読み取り/書き込みアクセス許可の優れたトリックを考え出しました。
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;
}