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

Comparing objects from two different classes?

本文关键字:两个 同类 对象 比较      更新时间:2023-10-16

你好,我一直在试图找出这个问题。我在这个函数中传递了一个对象来比较两个不同的卷,但是我需要使用两个不同的类(继承)来接收卷的信息。当我尝试传递对象时,我很难尝试使用传递对象的circleType和圆柱体类型类。我不确定如何正确地解决这个问题,但我正在努力弄清楚如何在比较函数中使用两个不同的类。

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

您的实现存在多个问题。您收到两个形状,但是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();
}

这样,您就可以为所有可能具有volume()函数的形状实现volumeEqual

我想它可能看起来像这样:

bool equalVolume(const circleType& cir, const cylinderType& cyl)
{
    return cir.CalcVolume == cyl.CalcVolume;
}

正如另一个用户指出的,我可能会添加一个volume() getter函数,并使用它来代替直接访问CalcVolume(它可能是一个数据成员)。

PS:写这样一个比较卷的函数看起来是多余的,因为你总是可以在if()条件中比较卷。