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