2015-01-13 2 views
1

В настоящее время я работаю над назначением относительно мобильных роботов. Я разрабатываю Windows с помощью QT-Creator, используя CMake и Visual C++ Compiler 10.0.C++ нет соответствия для 'operator ='

Как робот работает над Ubuntu, мне нужно скомпилировать проект с помощью QT-Creator на Ubuntu с компилятором GNU x86.

Теперь вот проблема, относительно класса Box, который только хранящий некоторые Инт-значения:

Box.h

public: 
Box();                 
Box(int name, int sX, int sY, int width, int heigth);    
Box& operator = (Box &src);            
bool operator == (Box &src);          

private: 
int name;                
int startX, startY, endX, endY;          
int cgx, cgy;               
int width, height; 

Есть также некоторые Get-методы в этом заголовке (как int getName()).

Перегруженное присвоение оператор выглядит следующим образом:

Box &Box::operator =(Box &src){ 
    this->cgx = src.getCenterX(); 
    this->cgy = src.getCenterY(); 
    this->endX = src.getEndX(); 
    this->endY = src.getEndY(); 
    this->startX = src.getStartX(); 
    this->startY = src.getStartY(); 

    return *this;} 

Я использую объекты Box в другом классе, хранящиеся в std::list<Box>.

В Windows все работает нормально. Но на Ubuntu я получаю сообщение об ошибке no match for 'operator=' (operand types are 'Box' and 'const Box'), которое происходит в функции std::list.

Я совершенно не знаком с C++ и не использовал const в любом месте. Итак, как происходит эта ошибка и как ее решить?

+1

'Box & operator = (const Box &src);' – Borgleader

+0

В дополнение к другим комментариям 'bool operator == (const Box & src) const'; для' == 'также (параметр' const & 'и маркировать метод как 'const'). – crashmstr

+0

... и затем маркировать все методы' get ... 'const, так что их можно вызвать на' src'. Это, как правило, хорошая практика, во всяком случае, не только решения для эта конкретная проблема. –

ответ

2

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

  1. использование const Box& (не только Box&) в качестве типа источника входного сигнала, так как вы не изменяя источник;
  2. проверить самонастраивание внутри перегруженной реализации оператора (if (&src != this)...).

В коде:

Box& Box::operator=(const Box& src) 
{ 
    if (&src != this) 
    { 
     this->cgx = src.getCenterX(); 
     this->cgy = src.getCenterY(); 
     this->endX = src.getEndX(); 
     this->endY = src.getEndY(); 
     this->startX = src.getStartX(); 
     this->startY = src.getStartY(); 
    } 
    return *this; 
} 

Заметим также, что если вы вручную определить назначение копирования operator=(), вы можете также определить конструктор в копию, вероятно, следуя той же копии логики, реализованный в вашем назначении operator=():

Box(const Box& src) : 
    cgx (src.getCenterX()), 
    cgy (src.getCenterY()), 
    endX (src.getEndX() ), 
    endY (src.getEndY() ), 
    startX(src.getStartX() ), 
    startY(src.getStartY() ) 
{} 

ПРИМЕЧАНИЯ

У вас есть элемент данных name в своем классе Box, что вы не копирования. Это опечатка? Вы действительно уверены, что не хотите его копировать? Может быть, это ошибка?

+0

Спасибо за помощь, это работает. С 'name': я тоже забыл скопировать его, так что спасибо за это, я добавил его в свой код. –

+0

@ RagnarDerSkalde: Добро пожаловать. Я рад, что это помогло. –

1

Оператор присваивания должен принять константный объект:

Box& operator = (const Box& src); 

Потому что это не повлияет на src, но только this.

Когда вы определяете оператор копирования, вы также должны определить конструктор копирования. См. http://en.cppreference.com/w/cpp/language/rule_of_three

Оператор сравнения должен принимать объект const и должен быть const (функция не изменяется this).

bool operator == (const Box& src) const; 

Потому что это не повлияет на src, ни this.

1

Попробуйте определении параметра константным:

Box& operator = (const Box &src);            

Кроме того, вы должны сделать то же самое для сравнения, даже если он не является источником вашей проблемы:

bool operator == (const Box &src) const; 

Я подозреваю, что право с вашей стороны или сравнения - const. Обратите внимание, что этот патерн является хорошей практикой, так как вы не изменяете свои параметры.

Я также сделал сравнение const, так как вы не будете изменять this.

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