C++ でカスタム イベントを作成することはできますか? たとえば、変数 X と変数 Y があるとします。X が変化するたびに、Y を 3X に設定する関数を実行したいと考えています。そのようなトリガー/イベントを作成する方法はありますか? (トリガーは一部のデータベースで一般的です)
5 に答える
これは基本的に Observer パターンのインスタンスです (他の人が言及してリンクしているように)。ただし、テンプレート マジックを使用して、もう少し構文的に見やすくすることができます。次のようなものを検討してください...
template <typename T>
class Observable
{
T underlying;
public:
Observable<T>& operator=(const T &rhs) {
underlying = rhs;
fireObservers();
return *this;
}
operator T() { return underlying; }
void addObserver(ObsType obs) { ... }
void fireObservers() { /* Pass every event handler a const & to this instance /* }
};
それからあなたは書くことができます...
Observable<int> x;
x.registerObserver(...);
x = 5;
int y = x;
オブザーバー コールバック関数を記述するためにどの方法を使用するかは、完全にあなた次第です。http://www.boost.orgの機能または機能モジュールをお勧めします (単純なファンクターも使用できます)。また、このタイプの演算子のオーバーロードには注意するように注意してください。特定のコーディングスタイルをより明確にすることができますが、無謀に次のようなレンダリングを使用します
ようですLikeAnIntToMe = 10;
非常にコストのかかる操作であり、爆発する可能性があり、デバッグの悪夢を今後何年も引き起こす可能性があります。
ブースト シグナルは、オブザーバー パターン (別名パブリッシュ-サブスクライブ) を実行するために遭遇する可能性があるもう 1 つの一般的に使用されるライブラリです。バイヤーはここで気をつけてください、その性能はひどいと聞きました。
Design Patterns、特にObserver Patternについて少し読むべきだと思います。
TrolltechのQt は、Signals および Slotsと呼ばれる優れたソリューションを実装しています。
私が知る限り、デフォルト変数ではそれを行うことはできませんが、コールバック関数を使用するクラスを作成した場合、他のクラスに変更の通知を希望することを登録させることができます。