2011-02-05 2 views
-1

У меня есть класс сцены с переменными-членами Image ** images, int * xcoords, int * ycoords. Теперь я пытаюсь перегрузить my = operator.Проблема с перегрузкой оператора

я получаю следующие ошибки памяти (с помощью Valgrind)

Conditional jump or move depends on uninitialised value(s) 
==6439== at 0x406FCA: Scene::drawscene() const (scene.cpp:160) 
==6439== by 0x4084C1: main (testscene.cpp:50) 

И линия в вопросе сверху (scene.cpp: 160) является

if (images[i]!=NULL) 

Так Theyre говоря, что изображения не было инициализируется.

И поэтому нигде еще не было вызвано drawscene(), но я не думаю, что, поскольку использовался оператор =, это вызвало проблему.

Может ли кто-нибудь увидеть какие-либо проблемы в моем коде, которые могут вызвать эту ошибку?

+0

Помните, что я сказал о [идиоме копирования и свопинга] (http://stackoverflow.com/questions/3279543/what-is-the-copy-and -swap-идиомы)? А именно, использовать его? – GManNickG

+0

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

+0

Это домашнее задание? – Marlon

ответ

3

Вам нужно это:

 if(source.images[i]!=NULL) { 
      images[i]=new Image; 
      *images[i]=*source.images[i]; 
      xcoords[i]=source.xcoords[i]; 
      ycoords[i]=source.ycoords[i]; 
     } else { 
      images[i] = NULL; 
     } 

и что будет решить непосредственную проблему. Но на самом деле, вы делаете это неправильно. Как сказал @Gman, вы должны использовать copy-and-swap idiom.

Причина использования идиомы - это исключение. Если что-то генерирует исключение в середине этого operator = (и есть много, что может, поскольку это так много), вы оставите объект в неопределенном состоянии, и это очень плохо. Идиома копирования и свопирования позволяет вам писать безопасный конструктор исключений (который все еще немного сложнее), а затем использовать его для создания оператора присваивания.

В качестве дополнительного бонуса вы получаете рабочий конструктор и функцию swap. Конструктор копирования очень удобен для наполнения вещей в контейнерах STL и передачи или возврата вещей по стоимости. И функция swap довольно чертовски полезна для пользователей вашего класса, особенно тех, кто хотел бы реализовать свои собственные конструкторы исключаемых копий и операторы присваивания.

+0

Ага, я вижу, что я пропустил там, спасибо ! – iRobot

0

Вы только инициализируете images[i], если source.images[i] не является NULL. Если source.images[i] NULL, вы оставляете случайный мусор в images[i]

Смежные вопросы