Qt Перегрузка оператора = для структуры

232
17 октября 2017, 03:18

Не получается перегрузить оператор = для структуры. Программа компилируется, но при выполнении прямого слияния крашится.

Структура:

struct Student
    {
        QString fio;
        int group;
        int ysp[5];
        Student& operator = (const Student &s)
        {
            fio = s.fio;
            group = s.group;
            ysp[0] = s.ysp[0];
            ysp[1] = s.ysp[1];
            ysp[2] = s.ysp[2];
            ysp[3] = s.ysp[3];
            ysp[4] = s.ysp[4];
            ysp[5] = s.ysp[5];
            return (*this);
        }
    };

Прямое слияние сортировка:

void MainWindow::Merge(Student *list_S, int left, int right)
{
    if (right == left) return;
    if (right - left == 1)
    {
        if (ui->Ascending->isChecked())
        {
            if (list_S[right].group < list_S[left].group) swap(list_S[right], list_S[left]);
        }
        if (ui->Descending->isChecked())
        {
            if (list_S[right].group > list_S[left].group) swap(list_S[right], list_S[left]);
        }
        return;
    }
    int m = (right + left) / 2;
    Merge(list_S,left, m);
    Merge(list_S,m + 1, right);
    Student buf[right];
    int xl = left;
    int xr = m + 1;
    int cur = 0;
    while (right - left + 1 != cur)
    {
        if (xl > m) buf[cur++] = list_S[xr++];
        else if (xr > right) buf[cur++] = list_S[xl++];
        else if (ui->Ascending->isChecked() && list_S[xl].group > list_S[xr].group)buf[cur++] = list_S[xr++];
        else if (ui->Descending->isChecked() && list_S[xl].group < list_S[xr].group)buf[cur++] = list_S[xr++];
        else buf[cur++] = list_S[xl++];
    }
    for (int i = 0; i < cur; i++) list_S[i + left] = buf[i];
}

Всё заработает если поправить в сортировке:

Student buf[right+1];
Answer 1

Строчка

ysp[5] = s.ysp[5];

лишняя. У вас в массиве 5 элементов, вот пять и копируйте (с 0 по 4), а в этой строчке вы гадите в память.

А на самом деле определять оператор присваивания в данном случае не нужно, так как оператор присваивания по умолчанию (синтезируемый компилятором автоматически) делает ровно то же самое.

READ ALSO
Работа с файлами, вопрос о перезаписи

Работа с файлами, вопрос о перезаписи

Имеется текстовый файл, в который записываются значения из массива типа intЗапись происходит таким образом:

246
Работа с *.STL файлами в С++

Работа с *.STL файлами в С++

Подскажите пожалуйста, какую технологию выбрать для работы с *STL файлами, и если возможно, небольшое интро в нее

242
Реально ли в плюсах создать анонимный класс через new?

Реально ли в плюсах создать анонимный класс через new?

Так же интересно, возможно ли как в джаве создать анонимный наследованный класс и сразу определить в нем методы Вместо этого:

233
jQuery Не работает $(this).css()

jQuery Не работает $(this).css()

Подскажите пожалуйста почему не работает?

300