如何修复重载增量和+;运算符并以分段错误结束? 我已经看过一些类似于我在C++中的作业中所遇到的问题,但我仍然找不到解决办法。

如何修复重载增量和+;运算符并以分段错误结束? 我已经看过一些类似于我在C++中的作业中所遇到的问题,但我仍然找不到解决办法。,c++,overloading,operator-keyword,C++,Overloading,Operator Keyword,我正试图使操作员超载,以使载客量增加int n。此外,超载运营商++将乘客容量增加1 注意多态性发生在我的类中,我有Ship(base),CruiseShip(派生) 巡洋舰建造师: CruiseShip::CruiseShip(string name, string year, int passengers) : Ship(name, year) { maxPassengers = passengers; } 运算符重载: CruiseShip& CruiseShip::op

我正试图使操作员超载,以使载客量增加int n。此外,超载运营商++将乘客容量增加1

注意多态性发生在我的类中,我有Ship(base),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;
}
主要内容:

intmain()
{
//创建对象、指针
船舶*船舶[3]={新船舶(“泰坦尼克号”、“2020年”)、新邮轮(“卢西亚号”、“2029号”、200号)、新货船(“卢维尼亚号”、“2025号”、500号)};
//打印船舶
适用于(船舶*s:船舶)
{
s->print();

cout实现此功能的方法是使用虚拟函数。但我们遇到了基类无法返回派生类对象的问题。因此,要解决此问题,我们可以让派生类返回基类。下面是一些示例代码:

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重载运算符返回的是船只,而不是CruiseShip。这满足了具有相同虚拟函数返回类型的要求


然后,主要来说,您需要做的唯一更改是取消对指针的引用,并将取消引用的指针放在括号中,如下所示:
(*Ship[1])++

据我所知,您的
运算符+
甚至不应该编译。Post a。数组不包含对象,它包含指针。因此,您所做的是指针算术运算,与重载运算符无关。@S.M。因此,据我所知,我显然是在地址上执行这些运算指针不是指向对象本身,而是指向对象本身吗?如果是的话,取消引用会解决这个问题吗?你自己试试。我尝试过调整它,但似乎最终还是出现了错误。嗯:/
操作符+
如果它是一个成员函数,那么它看起来只需要一个参数。也就是说,将它作为成员函数提供是一个设计缺陷(它应该返回一个新的值,而不是一个引用;
操作符+
对于
操作符+=
,而不是
操作符+
)是正确的。我的船级不包括它,主要是因为我不确定我将如何做,我考虑使用虚拟的,但这意味着函数头必须是相同的(返回类型的b/c不起作用)。老实说,我不知道如何取消对我的指针的引用,我尝试了几种不同的方法,但所有这些方法都会导致分段错误。如果你想按现在的方式进行操作,你必须将你的CruiseShip声明为CruiseShip,或者将重载运算符设置为虚拟。这是因为你使用的类型g、 如果你选择虚拟路由,你是对的,飞船必须返回相同的类型。解决这个问题的方法是让所有的具体类重载虚拟函数,或者让飞船自己返回,而不做任何事情。但是它必须返回相同的类型。如果我必须为我的operator++返回CruiseShip,但是CruiseShip不在飞船的目录中范围。我不明白虚拟函数是如何工作的,因为在ship类中,您无法将其编写为
virtualcruiseship operator++(int)
。在CruiseShip类中,这是必需的。啊。那么,你是对的,它可能不应该是虚拟的。我认为更好的方法是为飞船声明3个不同的指针。这样它们就不是Ship类型。我演示了它,它起了作用。我将发布我的解决方案
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;

};