0

C++ のオブジェクトがあります。

その関数の一部は、オブジェクトに変更を加えず、 として修飾されconstます。

他の関数は、いくつかの値が再計算される結果となるオブジェクトに変更を加えます。

私の質問は、非 const メソッドが使用された場合に自動的に呼び出される特別なクラス メソッドが C++ または C++11 に存在するかどうかです。

そうでない場合、これはなぜでしょうか?

4

1 に答える 1

2

簡単に言えば、いいえ、言語にはそれを直接サポートするものは何もありません。

パラメータが変更されたかどうかを追跡するために、コードを一元化するために少なくとも少しはできます。たとえば、次のような小さなテンプレートを作成できます。

template <class T>
class param {
    T value_;
    bool clean_;
public:
    param(T v) : value_(v), clean_(false) {}

    param &operator=(param &other) { value_ = other.value; clean_ = false; return *this; }

    param &operator=(T const &t) { value_ = t; clean_ = false; return *this; }

    operator T() { return value_; }    

    void clean() { clean_ = true; }

    bool isclean() { return clean_; }
};

次に、次のようなものがあります。

class integrator { 
    double value;
    param<double> a, b, c;

    double calculate_value(double a, double b, double c);

public:
    double operator()() { 
        if (a.isclean() && b.isclean() && c.isclean())
            return value;
        value = calculate_value(a, b, c);
        a.clean();
        b.clean();
        c.clean();
        return value;
    }
};

これはプロセス全体を自動化するわけではありませんが、コードを分離できるため、パラメーターを使用する関数のみがパラメーターが最新かどうかを追跡する必要があります。コードの残りの部分は、値を代入するだけで済みます。値は自動的にダーティとしてマークされます。

于 2013-02-15T23:53:37.680 に答える