2014-10-05 2 views
1

Рассмотрим следующий код:вина Сегментация и перегрузка операторов

bool Queue::operator+=(int value) { 
    std::cout << "Appending the value " << value; 
    std::cout << " by using operator overloading." << std::endl; 

    // in the actual code: q->append(value); 

    return false; 
} 

int main() { 
    Queue *q = new Queue(); 
    for (unsigned i = 0; i < 1000; i++) { 
     q+=6; 
    } 
    q->append(6); 
    delete q; 

    return EXIT_SUCCESS; 
} 

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

Я пытаюсь использовать оператор перегружать как Append которая добавляет элемент к объекту Queue. Основная функциональность работает с функцией Queue::append. В любом случае, я скомпилировал этот код, и операционная перегрузка оператора += компилируется без ошибок. Но программа все равно сработает.

При отладке, кажется, что всякий раз, когда я использую Queue объект q (например только деструктор или другую функцию, как Queue::append) после используя перегрузку, я получаю ошибку в сегментации.

Я не могу понять, что я делаю неправильно.

Очевидно, что в этом примере перегрузка состоит из выхода и возврата bool.

+9

Я думаю, что вы имели в виду '(* q) + = 6;' –

+0

Спасибо большое! Такая глупая ошибка ... Я как бы новичок в C++ и полностью проигнорировал это ... – Acctubi

ответ

4

q указан как указатель до Queue.

Выражение q += 6 делает не использовать перегрузку оператора вы объявленную, он использует стандартный оператор для указателей арифметика, и результаты в адрес указателя добавляется к.

После цикла forq не указывает на объект Queue и доступ к нему приводит к ошибке сегментации.

Для доступа к объекту q указывает на, вы должны разыменовать указатель, например. *q.