2

クラスによってのみ変更できるゲッターを使用せずにクラスメンバーを持つ方法はあるのでしょうか?

私が考えているのは、このようなものです。

class A 
{
    public:
        crazyconst int x;

        void doStuff()
        {
             // Gettin' stuff done
             x = someValue; // OK
        }
};

int main(int argc, char** argv)
{
     A a;
     a.x = 4; // ERROR
}

したがって、それは表示されますが、そのクラス以外の全員に対して読み取り専用です。

4

2 に答える 2

6

クラスはconst、プライベートな非constデータ メンバーへのパブリック参照を持つことができます。

編集:ただし、これを行うと、コンパイラによって生成されたコピー コンストラクターとコピー代入演算子を使用できなくなることを指摘する必要があります。

于 2012-04-26T03:04:16.340 に答える
4

答えは、ある種のゲッターなしではこれを行うことができないということです。ただし、getter を再利用可能にし、フィールドの単純な構文を (ほとんどの場合) 括弧なしで機能させることができます。

(C++11 が必要)

template<typename Friend, typename FieldType>
class crazyconst
{
    FieldType value;
    friend Friend;
    FieldType& operator=(const FieldType& newValue) { return value = newValue; }
public:
    operator FieldType(void) const { return value; }
    FieldType operator()(void) const { return value; }
};

class A
{
public:
    crazyconst<A, int> x;

    void doStuff()
    {
        // Gettin' stuff done
        x = 5; // OK
    }
};

int main(int argc, char** argv)
{
    A a;
    int b = a.x;
    int c = a.x(); // also works
}

C++03 バージョン: http://ideone.com/8T1Po

ただし、これはコンパイルされますが、期待どおりに動作しないことに注意してください。

const int& the_x = a.x;
a.doStuff();
std::cout << the_x;

OTOH、これは問題ないはずです:

const auto& ref_x = a.x;
a.doStuff();
std::cout << ref_x;
于 2012-04-26T03:04:20.350 に答える