переполнение стека при использовании конструктора копирования и / или оператора присваивания со строкой в ​​c ++ - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь запустить сортировку вставок на моем собственном простом классе, который имеет пару полей (int, float и string), а также конструктор копирования, оператор присваивания и оператор «>».

однако, я получаю переполнение стека при запуске кода ниже. visual studio сообщает мне, что это происходит из функции getName () в моем классе 'Student'. ошибка происходит от назначения в моей функции сортировки вставки arr[i + 1] = arr[i];

кто-нибудь знает, почему это так? Я относительно новичок в C ++, в основном из java фона.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Student {
public:
    Student(string nm, int ID, float avg): name(nm), studentID(ID), overallAverage(avg) {}

    Student(const Student& rhs) : name(rhs.getName()), studentID(rhs.getStudentID()), overallAverage(rhs.getOverallAverage()) {}

    // copy and swap idiom
    Student& operator=(const Student& rhs) {
        Student copy = rhs;  // places a copy of rhs into copy using the copy constructor (copy will be cleaned up on return)
        swap(*this, copy); // move copy or rhs into this, this is a pointer to current object, *this dereferences the pointer
        return *this; 
    }
    ~Student() {}

    bool operator>(const Student& rhs) {
        if (rhs.getOverallAverage() > overallAverage)
            return false;
        else return true; 
    }

    string getName()const { return name; }
    int getStudentID()const { return studentID;  }
    float getOverallAverage()const { return overallAverage; }

private:
    string name; 
    int studentID; 
    float overallAverage; 

};

template<typename T> 
vector<T>& insertionSort(vector<T>& arr){
    for (int j = 1; j < arr.size(); j++) {
        T key = arr[j]; 
        int i = j - 1; 
        while (i > -1 && arr[i] > key) {
            arr[i + 1] = arr[i]; 
            i = i - 1; 
        }
        arr[i + 1] = key; 
    }
    return arr; 
}


int main()
{
    vector<Student> students = {Student("russ",0,89),Student("Seb",1,75),Student("julia",2,85),
                                Student("johnny",3,90),Student("Sushma",4,55)}; 

    students = insertionSort(students); 

    for (int i = 0; i < students.size(); i++) {
        cout << students[i].getName() << ", ";
    }
    cout << endl;  
}

оригинальный оператор = из txtbook, который я использую:

IntCell & operator= ( const IntCell & rhs ) // Copy assignment
{
IntCell copy = rhs;
std::swap( *this, copy );
return *this;
}

1 Ответ

2 голосов
/ 12 января 2020

Бесконечная рекурсия вызвана std::swap вызовом Student::operator=, который вызывает std::swap, который вызывает Student::operator=, et c.

Чтобы облегчить это, напишите свой swap функция, которая вызывает std::swap для каждого из членов:

class Student
{
//...
   void swap(Student& left, Student& right)
    {
        std::swap(left.name, right.name);
        std::swap(left.studentID, right.studentID);
        std::swap(left.overallAverage, right.overallAverage);
    }
//...
};
...