Как получить константную ссылку на объект и изменить объект, используя эту ссылку (Используя const_cast)? - PullRequest
1 голос
/ 13 декабря 2011

У меня есть функция-член, возвращающая ссылку const на экземпляр класса.

Пример:

class State
{
  const City* city1;
public:
  State(const City& c) : city1(c) {}
  const City& getReference() const {return *city1;}
  void changeStuff();
};

Как получить неконстантный City *, указывающий на city1 с помощью const_cast и getReference ()?

Кроме того, выполнив следующее, я смог достичь того, чего хотел, без использования const_cast: (Предполагая, что уже есть экземпляр State с именем state1)

City ref = state1.getReference(); //Why does it work?
City * ptr = &ref; //This is what I wanted, but not this way
ref->changeStuff(); //How can I call functions changing things if the reference was constant?

Как я могу получить неконстантную ссылку от функции, возвращающей константную ссылку и даже установщиков вызовов?

Спасибо за внимание

Ответы [ 2 ]

3 голосов
/ 13 декабря 2011
City ref = state1.getReference(); //Why does it work?

Это работает, потому что это не ссылка. Вы делаете копию значения const. Попробуйте это:

City & ref = state1.getReference();

Это не сработает. Вы можете использовать const cast следующим образом:

City * ptr = const_cast<City*>(&state1.getReference());

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

0 голосов
/ 13 декабря 2011

Если вы объявили что-то const, точно так же, как вы даете обещание компилятору, вы никогда не измените содержимое этой вещи, зачем вам это делать?

Если вы действительноЕсли вы хотите что-то изменить в типе const, вы должны объявить, что mutable:

class A
{
public:
mutable int _change_me;
};

Теперь вы можете изменить элемент _change_me, даже если у вас есть ссылка на const для class A.

...