4

enabled_m値が変数の数に依存するメンバー変数 があります。これらの不変条件はクラスによって維持される必要があるため、次のようにしたいと考えていますprivate

class foo_t
{
public:
    void set_this(...); // may affect enabled_m
    void set_that(...); // may affect enabled_m
    void set_the_other_thing(...); // may affect enabled_m

    bool is_enabled() const { return enabled_m; }

private:
    bool enabled_m;
};

これはうまくいきますが、本当に私の意図は、 のユーザーがfoo_tクラスを通過して を変更する enabled_mことを要求することです。ユーザーが単にを読み たい場合enabled_m、それは許容される操作である必要があります。

bool my_enabled = foo.enabled_m; // OK
foo.enabled_m = my_enabled; // Error: enabled_m is private

ユーザーがアクセサルーチンを通過する必要なしに、操作と非操作enabled_m publicを行う方法はありますか?constprivateconst

4

3 に答える 3

5

ここでの多くは、有効な状態を公開する背後にある意図に依存します、私の一般的なアドバイスは、それ公開しないことです。

your の通常の使用法は次のis_enabledようになります。

if (f.is_enabled())
    f.set_this(whatever);

私の意見では、ほとんどのset_this場合、 を呼び出して、(クライアントが気にする場合) 成功したかどうかを示す値を返すようにする方がよいため、クライアント コードは次のようになります。

if (!f.set_this(whatever))
   // deal with error

これは、マルチスレッド プログラミングを開始するときには些細な違いのように思えるかもしれませんが (1 つの主要な例として)、この違いは絶対的に重要になります。特に、有効な状態をテストしてから値を設定しようとする最初のコードは、競合状態の影響を受けます。状態は、 への呼び出しと へenabledの呼び出しの間で変化する可能性があります。is_enabledset_this

端的に言えば、これは通常、お粗末な設計です。やらないでください。

于 2014-10-31T17:31:30.047 に答える