Как вы отбрасываете константность, когда функция получает ссылку на объект (и получает доступ к неконстантным методам)? - PullRequest
3 голосов
/ 28 февраля 2012

У меня есть резервная копия данных, которую я хотел бы защитить, поэтому я сделал ее const.Мне нужно дважды нарушить это const, чтобы сохранить в нем первичные данные:

fgBlocks.CopyInto((BlkArray&)backUpCopy);

по

result CopyInto(BlkArray &replica) const {/**/}

и еще раз при вызове RemoveAll()это неконстантный метод:

((BlkArray)backUpCopy).RemoveAll(true);

Правильно ли выполнено первое приведение (показано выше, (BlkArray&))?Это тот аспект косвенности, который я не использовал до сих пор.Затем я снова добавлю еще один неиспользуемый аспект - исключение const ness для вызова методов объекта, которые компилятор не принимает, как показано выше.

Члены объявлены следующим образом:

BlkArray fgBlocks;
const BlkArray backUpCopy;

Я пытаюсь расширить решение Корреа, поэтому имейте:

    BlkArray *pBUCopy = (BlkArray *)&backUpCopy;
    fgBlocks.CopyInto(*pBUCopy);

Единственная проблема сейчас - сбой компилятора из-за

неинициализированного члена 'MyClass:: backUpCopy 'с типом' const '' const BlockArray '

Ответы [ 3 ]

7 голосов
/ 28 февраля 2012

Имейте в виду, что если вы делаете это и объект действительно равен const, то изменение его после отбрасывания const ness является неопределенным поведением.

fgBlocks.CopyInto(const_cast<BlkArray&>(backUpCopy));

То же самое для другого:

const_cast<BlkArray&>(backUpCopy).RemoveAll(true);
0 голосов
/ 28 февраля 2012

Я изучил небольшой трюк, изучая внутренности Qt:

MyClass:circunventConst() const
{
    MyClass* that = const_cast<MyClass*>(this);
    that->myProtectedVariable = value;
}
0 голосов
/ 28 февраля 2012

Вы можете обойти эту проблему, просто пометив все методы как const, кроме RemoveAll и CopyFrom, причем последний считается методом BlkArray, который либо реализует логику, либо передает *thisCopyInto.

Чтобы быть более уверенным в том, кто может очистить данные / скопировать в них новые данные, вы можете сделать эти методы закрытыми и объявить необходимые классы друзьями, либо использовать шаблон ключа доступа чтобы защитить эти два метода.

...