比较来自两个不同类的对象?

时间:2016-11-15 05:32:09

标签: c++ inheritance

您好我一直试图解决这个问题。我在这个函数中传递一个对象来比较两个不同的卷,但是我需要使用两个不同的类(继承)来接收卷的信息。当我尝试传递对象时,我很难尝试将circleType和cylinderType类与传递的对象一起使用。我不确定如何正确地处理这个问题,但我想弄清楚如何在比较函数中使用两个不同的类。

bool equalVolume(const circleType&, const cylinderType& ct)
{
    if (ct.CalcVolume != Calvolume())
    {
        return false;
    }
    else
    {
        return true;
    }
}

2 个答案:

答案 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()条件中的卷。