Как мне написать метод доступа const, который возвращает ссылку на объект-член, чтобы он мог быть отредактирован? - PullRequest
1 голос
/ 20 октября 2010

Вот проблема. Я написал эту функцию, чтобы она возвращала ссылку на элемент i вектора-члена, поэтому этот элемент можно редактировать. Вот код:

Letter& Literal::get (int i) const {

   return lit_m.at (i); //Vector of Letter objects
}

Но g ++ не позволит мне присвоить этот элемент неконстантной ссылке:

g++ -o literal.o -c literal.cpp
literal.cpp: In member function ‘Letter& Literal::get(int) const’:
literal.cpp:34: error: invalid initialization of reference of type ‘Letter&’ from expression of type ‘const Letter’

Как это можно решить? Моя идея состоит в том, чтобы создать функцию, подобную функции at () векторов, поэтому она будет const, поскольку она не редактирует сам объект, но должна позволить мне редактировать возвращенный объект ... Возможно ли это? *

РЕШЕНО: Мне просто пришлось перегрузить функцию :), поэтому объявляем постоянную и неконстантную версии. Я боялся, что const и неконстантная перегрузка недопустимы, но я увидел, что это const меняет список аргументов, делая это возможным.

Ответы [ 3 ]

5 голосов
/ 20 октября 2010

Проблема в том, что эта функция-член:

Letter& get (int i) const

вы объявили ее const, и из-за этого вызывается

const T& at() const

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

Если вам действительно нужно изменить этот элемент, не объявляйте вашу функцию get () как const и возвращайте ссылку на элемент, как выделаю сейчас.

кстати, вы объявили функцию const и возвращаете неконстантную ссылку.

2 голосов
/ 20 октября 2010

Есть очень веская причина, по которой возникает ошибка.Объект вашего класса должен быть постоянным, чтобы сохранить свое состояние.Когда вы возвращаете ссылку на одну из ее внутренних переменных, вы позволяете кому-то изменить значение этой внутренней переменной, тем самым изменив состояние объекта, превратив его в постоянную функцию.

То, чтовозможно, если класс Literal содержит вектор указателей на объекты Letter вместо объектов Letter, вы можете успешно вернуть ponter для одного из этих объектов Letter без проблем.

Letter* Literal::get (int i) const {
   return lit_m.at (i); //Vector of pointers to Letter objects  
} 

Вероятно, статья, которую каждый имеет делос указателями следует читать (или любой язык, допускающий ключевое слово const, но в 10 раз больше, если указатели задействованы) можно найти здесь .Честно говоря, я, наверное, сам должен еще раз просмотреть это.

0 голосов
/ 20 октября 2010

Это не правильно. Вы изменяете переменную-член класса (вектор), поэтому g ++ видит это как ошибку. Когда вы объявляете метод как const и возвращаете переменную-член, ожидается, что возвращаемое значение используется для inspection, а не mutation.

...