1
class A
{
public:
    A(){ val = 0; p = new int; *p = 0; }
    //void fun_1()const{ val = 1; }  not allowed
    void fun_2()const{ *p = 1; }
    void display()const{ cout<< val <<' '<< *p <<endl; }
private:
    int val;
    int * p;
};

int main()
{
    const A a;
    a.fun_2();
}

const メンバー関数のようなメンバー データの変更fun_1()constは許可されていません。ただし、データがオブジェクトの直接のメンバーではなく、ストレージが割り当てられ、オブジェクト内で割り当てられている場合、const 関数はそれを保護できません。たとえば const 関数ですが、指すfun_2()constデータを変更できます。p

pを指すデータを保護する方法はありますか?

4

4 に答える 4

3

ポインター先のオブジェクトをコンパイラーに保護させるのは比較的簡単ですが、常に正しいことを行うとは限らないため、これは自動的には行われません。

template<typename T>
class constinator_ptr
{
    T* p;
public:
    explicit constinator_ptr( T* p_init ) : p (p_init) {}

    T*& ptr() { return p; } // use this to reassign, or also define operator=(T*)

    T* operator->() { return p; }
    const T* operator->() const { return p; }
    T& operator*() { return *p; }
    const T& operator*() const { return *p; }
};

次のように、生のポインターの代わりにこれを使用してください。

class A
{
public:
    A() : val{0}, p{new int(0)} {}
    //void fun_1()const{ val = 1; }  not allowed
    void fun_2()const{ *p = 1; } // now causes error
    void display()const{ cout<< val <<' '<< *p <<endl; }
private:
    int val;
    constinator_ptr<int> p;
};
于 2013-10-06T15:58:23.893 に答える