Если class B
всегда будет работать с *a
как const
объект, то, как другие сказали все, что нужно просто изменить декларацию
public: const A* a
На этом этапе я должен упомянуть, что константа B::Func2
- это красная сельдь, потому что она абсолютно не связана с константой B::a
. То, что B::Func2
равно const
, означает, что не допускается изменять значение a
; однако, это is разрешено разыгрывать a
и мутировать полученный объект.
Теперь, если class B
имеет как 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
сохранить независимость, соответственно типизированных указателей на объект, чтобы получить доступ. Если setA
вызывается на B
или на D
с параметром const A*
, то устанавливается только B::a
. Если setA
вызывается на D
с A*
, то оба B::a
и D::a
правильно установлены. Это стало возможным, потому что, абстрагировав член за сеттером, вы можете перегрузить setter на константу его параметра.
Вы не можете изменить что-либо, связанное с объектом, когда у вас есть функция const. Либо вызовите его const * A a, либо удалите const из функции. – Martol1ni