C++ и константа - доступ к функции членства ссылки константы

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

5
задан Extrakun 17 August 2009 в 06:20
поделиться

5 ответов

Без определения SceneTrackerData трудно сказать, но, вероятно, эта функция ( SceneTrackerData :: getRect ) не помечена как const.

То есть, что (предположение):

const Rect& SceneTrackerData::getRect(void)

Должно быть:

const Rect& SceneTrackerData::getRect(void) const 
                        //                     ^
                        //                     |
                        // does not logically modify the object
13
ответ дан 18 December 2019 в 10:47
поделиться

Я думаю, что такие строки недопустимы:

links_ = new QList<QGraphicsLineItem*>(*links);

points_ = new QList<QGraphicsEllipseItem*>(*points);

в том смысле, что переданные в ссылки и точки не определены как указатели, а определены ценности. Чтобы скомпилировать код, вам, вероятно, потребуется либо определить их так

const QList<QGraphicsLineItem*>* links

, либо вместо этого использовать их так

links_ = new QList<QGraphicsLineItem*>(&links);  // don't actually do this

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

Если QList не использует глубокую копию, ваше приложение может аварийно завершить работу.

1
ответ дан 18 December 2019 в 10:47
поделиться

Я не уверен, так как я не опытный программист на C ++, но объявлены ли ваши функции getRect () и т. Д. Const? Если нет, но вы знаете, что они используются как const, вы все равно можете использовать const_cast для удаления константы из ссылки на initialData.

См., Например, здесь: http://docs.oracle.com/cd /E19422-01/819-3690/Cast.html

Или Скотт Мейерс, превосходный C ++ - Книги Эффективный C ++ и Более эффективный C ++ . По крайней мере в одном из них есть пункт о постоянстве.

1
ответ дан 18 December 2019 в 10:47
поделиться

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

1
ответ дан 18 December 2019 в 10:47
поделиться
links_ = new QList<QGraphicsLineItem*>(*links);

Это потенциально может быть законным, если оператор * перегружен для класса QList, хотя я не думаю, что это так. Хотя, как упоминалось выше, вы, вероятно, пытаетесь выполнить

links_ = new QList<QGraphicsLineItem*>(links);

В зависимости от того, что принимает фактический конструктор.

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

При работе с константностью нужно помнить, что константа НЕ гарантируется. Существуют структуры, такие как "const_cast", чтобы лишить объект константности. Наличие константного объекта и использование константных функций помогает указать другим разработчикам, что код не должен изменять объект, не то чтобы он не мог изменить его. Видите разницу?

void bar(const Foo& f) {
     f.setX(5); // compile error, f is const
     Foo &f2 = const_cast<Foo&>(f);
     f2.setX(5); // compiles just fine
}

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

0
ответ дан 18 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: