2017-01-25 3 views
-1

Мне сложно определить, как работает перегрузка оператора присваивания. У меня есть класс с именем MyClass:Как работает перегрузка оператора для оператора присваивания?

class myClass { 
public: 
    myClass(); 
    myClass& operator+(const myClass& rhs); 
    myClass& operator=(const myClass& rhs); 
    myClass& operator+=(const myClass& rhs); 

    myClass& return_myClass(std::vector<bool> vector); 
    void print_vector() const; 
private: 
    std::vector<bool> bit; 
}; 

myClass& myClass::operator=(const myClass& rhs) { 
int bitA = this->bit.size(); 
int bitB = rhs.bit.size(); 
int length; 
std::vector<bool> return_vector; 
if (bitA > bitB) { 
    length = bitA; 
} else { 
    length = bitB; 
} 
for (int i = 0; i < length; ++i) { 
    return_vector[i] = rhs.bit[i]; 
} 
return return_myClass(return_vector); 
} 

int main() { 
    // declare a and b 
    myClass plus += a + b; plus.print_vector(); 
    return 0; 
} 

Я пропустил много кода, но я думаю, вы получите общее представление. Когда я запускаю программу, я получаю сообщение об ошибке «Thread 1: EXC_BAD_ACCESS». Оператор +, а также другие функции работают правильно, поэтому я предполагаю, что с оператором что-то не так. Я хочу объединить операторы + и =, чтобы сделать оператор + =, но я не могу заставить оператор = работать.

Обратите внимание, что логика, которую я набрал, должна выполняться, то есть назначение должно выполняться на векторе, а затем должно быть возвращено как объект myClass с использованием return_myClass.

+1

Оператор присваивания не вызывается, потому что 'myClass plus = a + b;' не является назначением. – Oktalist

+0

'return_myClass' очень подозрительно. Где он возвращает «myClass» по ссылке? Вы не можете сделать 'return_vector [i]' на пустой вектор. – aschepler

+0

'myClass plus + = a + b;' даже не компилируется. – aschepler

ответ

0

Ваша реализация operator= полностью неправильная. Семантика operator=(const T& rhs) заключается в том, чтобы скопировать содержимое rhs в *this, а не в новый временный объект. Затем вы должны вернуть *this.

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

Кроме того, если this->bit.size() > rhs.bit.size(), вы читаете конец rhs. И, как отметил в комментариях асеплер, во всех случаях вы записываете конец return_vector.

vector<bool> имеет совершенно хороший оператор присваивания уже, так что все, что вам нужно, это

myClass& myClass::operator=(const myClass& rhs) = default; 
0

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

myClass& operator=(const myClass& other) 
{ 
    if (this != &other) // self-assignment test 
    { 
     bit = other.bit; 
    } 

    return *this; 
} 

Для получения дополнительной информации см What is the copy-and-swap idiom?