с правильностью

У меня есть метод const, в котором я хочу установить атрибут члена класса B на текущий экземпляр A (чтобы сделать обратную ссылку по указателю)

Класс А:

void A::foo () const
{
...
...
B b;
b.setA(this);
...
}

Класс Б:

setA(A * Ap){
this->pointerToA = Ap;
}

B * getA() {return pointerToA;}

A* pointerToA;

Компилятор не позволяет этого … Хорошо
Теперь я пытался

Класс Б:

setA(const A * Ap){
this->pointerToA = Ap;
}

const A * getA() {return pointerToA;}

const A* pointerToA;

Это решает исходную проблему, но теперь я не могу позвонить в B:

...
this->getA()->anotherMethodOfA();
...

потому что я получаю «не могу» преобразовать этот указатель из «const A» в «A&’

Хотя я понимаю верхнюю проблему, я не могу понять, как вызвать другой метод сейчас и в чем проблема … Почему существует A& в сообщении об ошибке, так как я нигде не ссылаюсь на A?

0

Решение

Поскольку A является постоянным указателем, вы можете только вызвать const методы на это. Есть два возможных решения:

  1. если вам нужно вызвать неконстантный метод на A: удалите const спецификатор от void A::foo () const, так как функция на самом деле модифицирует this через звонки Б.
  2. если вам не нужно вызывать неконстантный метод для A: make anotherMethodOfA и любой другой метод, вызванный на A внутри B const тоже.

Полученная вами ошибка является законной, иначе вы бы нарушили определение чистого метода.

Если тебе надо foo быть const и методы, вызываемые на A внутри foo не изменяйте его так, чтобы оно было видно через открытый интерфейс (например, выполняйте некоторое кэширование или тому подобное), вы также можете попробовать использовать mutable спецификатор с измененными полями. Но не злоупотребляйте этой функцией, пожалуйста!

1

Другие решения

Вы можете решить проблему с помощью Scott Meyers' Решение: две версии всех геттеров, одна non-const версия, которая вызывает const версия и const версия возвращает предполагаемую переменную:

const A* GetA() const { return pointerToA; }
//Cast 'this' to a const reference to B
//(this allows you to call the const version of the getter instead of infinite recursion).
//Cast away the const-ness of the result returned by the const version
//and return the non-const version.
A* GetA() { return const_cast<A*>(static_cast<const B&>(*this).getA()); }
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector