您好我一直试图解决这个问题。我在这个函数中传递一个对象来比较两个不同的卷,但是我需要使用两个不同的类(继承)来接收卷的信息。当我尝试传递对象时,我很难尝试将circleType和cylinderType类与传递的对象一起使用。我不确定如何正确地处理这个问题,但我想弄清楚如何在比较函数中使用两个不同的类。
bool equalVolume(const circleType&, const cylinderType& ct)
{
if (ct.CalcVolume != Calvolume())
{
return false;
}
else
{
return true;
}
}
答案 0 :(得分:2)
您的实施存在多个问题。您会收到两种形状,但circleType
没有变体名称。然后我看到你试图在没有变量的情况下调用函数calcVolume
。你怎么能计算出什么都没有?好吧,你不能。您必须使用圆圈的名称并参考它。
// v---- Give a name to your circle
bool equalVolume(const CircleType& myCircle, const CylinderType& myCylinder) {
// v---- Call calcVolume with myCircle
if (myCircle.calcVolume() != myCylinder.calcVolume()) {
// call with the cylinder --^
return false
} else {
return true;
}
}
顺便说一句,由于比较已经是bool
类型的表达式,您可以将函数缩小到:
bool equalVolume(const CircleType& myCircle, const CylinderType& myCylinder) {
return myCircle.calcVolume() == myCylinder.calcVolume();
}
我宁愿创建一个返回卷的函数,并将实现留给用户。它看起来像那样:
using volume_t = double;
struct Circle {
volume_t volume() const {
// return volume here
}
};
struct Cylinder {
volume_t volume() const {
// return volume here
}
};
然后,不要使用isVolumeEqual
函数,而是执行此操作:
if (myCircle.volume() == myCylinder.volume()) {
// code here ...
}
如果你真的想实现音量相等的功能,我会这样做:
template<typename S1, typename S2>
auto volumeEqual(const S1& s1, const S2& s2) -> decltype(s1.volume() == s2.volume()) {
return s1.volume() == s2.volume();
}
这样,您可以为具有volumeEqual
功能的所有可能形状实施volume()
。
答案 1 :(得分:2)
我认为它可能看起来像这样:
bool equalVolume(const circleType& cir, const cylinderType& cyl)
{
return cir.CalcVolume == cyl.CalcVolume;
}
正如另一位用户指出的那样,我可能会添加一个volume()getter函数并使用它来代替直接访问CalcVolume(可能是数据成员)。
PS:编写一个比较这样的卷的函数看起来是多余的,因为你总是可以只比较if()条件中的卷。