class B
常にオブジェクト*a
として機能する場合const
は、他の人が言っているように、宣言を次のように変更するだけです。
public: const A* a
この時点で、 の constness は、 の constness とB::Func2
はまったく関係がないため、ニシンであることに言及する必要がありB::a
ます。つまり、 の値を変更することは許可されていませB::Func2
ん。ただし、結果のオブジェクトを逆参照して変更することは許可されています。const
a
a
ここで、と 非操作class B
の両方がある場合、クラスの設計を変更する必要があります。上記のようにa を使用するように切り替え、すべての変更操作をカプセル化する別の a を追加すると、はるかに優れたものになります。さらに、プロパティ セッターの背後に隠されている必要があります。これにより、次のようなことができますconst
const
*a
class B
const A* a
class D : public B
a
class B {
const A* a;
public:
void setA(const A* a) { this->a = a; }
void Func2() const {}
};
class D : public B {
A* a;
public:
using B::setA;
void setA(A* a) {
this->a = a;
static_cast<B*>(this)->setA(const_cast<const A*>(a));
}
void Func3() { /* do something to D::a */ }
};
このスキームを使用すると、アクセスするオブジェクトへの適切に型指定された独立したポインターを維持できますB
。、またはパラメータを指定して で呼び出されたD
場合は、 のみが設定されます。が で呼び出された場合、と の両方が適切に設定されます。これが可能になったのは、セッターの背後でメンバーを抽象化することにより、パラメーターの constness でセッターをオーバーロードできるためです。setA
B
D
const A*
B::a
setA
D
A*
B::a
D::a