Как исправить инкремент перегрузки и оператор + и заканчивая ошибкой сегментации? - PullRequest
0 голосов
/ 04 декабря 2018

Я просмотрел несколько статей, которые кажутся похожими на мои проблемы, с которыми я сталкиваюсь в своей домашней работе для введения в C ++, но все еще не могу найти решение.

Я пытаюсьперегрузить оператора + для увеличения пассажировместимости на межд.Кроме того, перегружая оператора ++ для увеличения пассажировместимости на 1.

Обратите внимание, что в моем классе происходит полиморфизм, у меня есть Ship (base), CruiseShip (производный).

Конструктор CruiseShip:

CruiseShip::CruiseShip(string name, string year, int passengers) : Ship(name, year)
{
    maxPassengers = passengers;
}

Перегрузки оператора:

CruiseShip& CruiseShip::operator+(int n) const
{
    maxPassengers += n;
    return *this;
}

CruiseShip& CruiseShip::operator++() // prefix
{
    ++maxPassengers;
    return *this;
}

CruiseShip CruiseShip::operator++(int) // postfix
{
    CruiseShip temp(*this);
    operator++();
    return temp;
}

Main:

int main()
{

//Create objects, pointers
Ship *ships[3] = {new Ship("Titania", "2020"), new CruiseShip("Lusia", "2029", 200), new CargoShip("Luvinia", "2025", 500)};

//Print out ships
for(Ship *s : ships)
{
    s -> print();
    cout << endl;
}

//Reset a ships passenger, capacity
//I've tried testing each individually and all 3 still end up with segmentation errors
ships[1] = ships[1] + 5; //segmentation error related to this
ships[1]++; // segmentation error related to this
++ships[1]; // segmentation error related to this

//Print out ships
for(Ship *s : ships)
{
    s -> print();
    cout << endl;
}

//deallocate
return 0;
}

1 Ответ

0 голосов
/ 04 декабря 2018

Способ заставить эту работу использовать виртуальные функции.Но мы сталкиваемся с проблемой, что базовый класс не может возвращать объект производного класса.Таким образом, чтобы решить эту проблему, мы можем просто сделать так, чтобы класс Derived возвращал базовый класс.Итак, вот пример кода:

class Ship
{
public:
    Ship(string name, string year)
    {
        this->name = name;
        this->year = year;
    }

    virtual Ship & operator + (int n)
    {
        return *this;
    }

    virtual Ship & operator ++()
    {
        return *this;
    }

    virtual Ship & operator ++ (int i)
    {
        return *this;
    }
public:

    string name;
    string year;
};

class CruiseShip : public Ship
{
public:
    virtual Ship& operator+(int n)
    {
        maxPassengers += n;
        return *this;
    }

    virtual Ship & operator++() // prefix
    {
        ++maxPassengers;
        return *this;
    }

    virtual Ship & operator++(int) // postfix
    {
        CruiseShip temp(*this);
        operator++();
        return temp;
    }


    CruiseShip(string name, string year, int passengers) : Ship(name, year)
    {
        maxPassengers = passengers;
    }

    int maxPassengers;

};

Создание виртуальной функции как в базовом классе, так и в производном классе позволяет получить определение, независимо от того, какой это тип корабля И, тем не менее, позволяет определитьВиртуальная функция по-разному в производном классе.

Обратите внимание, что перегруженные операторы CruiseShip возвращают Ships, а не CruiseShips.Это удовлетворяет требованию иметь тот же тип возвращаемого значения виртуальной функции.

Тогда в main единственные изменения, которые вам нужно будет сделать, - это разыменовать ваш указатель и поместить этот разыменованный указатель в круглые скобки, например так: (*Ship[1])++

...