Я определенно поместил бы возврат в блокировке. Иначе Вы рискуете другим потоком, вводящим блокировку и изменяющим Вашу переменную перед оператором возврата, поэтому заставляя исходную вызывающую сторону получить другое значение, чем ожидалось.
Без определения SceneTrackerData
трудно сказать, но, вероятно, эта функция ( SceneTrackerData :: getRect
) не помечена как const.
То есть, что (предположение):
const Rect& SceneTrackerData::getRect(void)
Должно быть:
const Rect& SceneTrackerData::getRect(void) const
// ^
// |
// does not logically modify the object
Я думаю, что такие строки недопустимы:
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 не использует глубокую копию, ваше приложение может аварийно завершить работу.
Я не уверен, так как я не опытный программист на C ++, но объявлены ли ваши функции getRect () и т. Д. Const? Если нет, но вы знаете, что они используются как const, вы все равно можете использовать const_cast для удаления константы из ссылки на initialData.
См., Например, здесь: http://docs.oracle.com/cd /E19422-01/819-3690/Cast.html
Или Скотт Мейерс, превосходный C ++ - Книги Эффективный C ++ и Более эффективный C ++ . По крайней мере в одном из них есть пункт о постоянстве.
Непонятно, какая здесь строка 23; но я предполагаю, что вы вызываете методы объекта, которые сами не объявлены как const
и поэтому не могут использоваться ссылкой на объект const
.
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
}
Полезная часть состоит в том, что непреднамеренные попытки изменить объект приведут к ошибкам компилятора, решительный программист может легко обойти эту защиту.