(可比&op2)=0; //虚拟布尔运算符radius=radius;} int getRadius(){return radius;} 布尔运算符>(可比&op2) { if(radius>op2.radius)//b)返回a; 其他的 返回b; } void main() { 圆华夫饼(10),比萨饼(20),y; y=更大(华夫饼、比萨饼); 如果你确定传递给它的唯一对象是Circle类型的,那么静态强制转换就足够了。如果不是这样,那么尝试使用动态强制转换来检查它是否是Circle对象。如果失败,那么只返回false。注:动态强制转换将把演出搞砸了 bool operator > (Comparable& op2) { Circle* foo = dynamic_cast<Circle*>(&op2); if (foo && (radius > foo->getRadius())) { return true; } else { return false; } } bool操作符>(可比&op2) { 圆圈*foo=动态_投射(&op2); 如果(foo&(radius>foo->getRadius()) { 返回true; } 其他的 { 返回false; } } >P> C++中,C++类不是java类,C++不是Java;它有自己的成语。在标准库中,你没有看到任何类似于代码>可比的< />代码,这是你试图向错误方向移动的强烈暗示。,c++,C++" /> (可比&op2)=0; //虚拟布尔运算符radius=radius;} int getRadius(){return radius;} 布尔运算符>(可比&op2) { if(radius>op2.radius)//b)返回a; 其他的 返回b; } void main() { 圆华夫饼(10),比萨饼(20),y; y=更大(华夫饼、比萨饼); 如果你确定传递给它的唯一对象是Circle类型的,那么静态强制转换就足够了。如果不是这样,那么尝试使用动态强制转换来检查它是否是Circle对象。如果失败,那么只返回false。注:动态强制转换将把演出搞砸了 bool operator > (Comparable& op2) { Circle* foo = dynamic_cast<Circle*>(&op2); if (foo && (radius > foo->getRadius())) { return true; } else { return false; } } bool操作符>(可比&op2) { 圆圈*foo=动态_投射(&op2); 如果(foo&(radius>foo->getRadius()) { 返回true; } 其他的 { 返回false; } } >P> C++中,C++类不是java类,C++不是Java;它有自己的成语。在标准库中,你没有看到任何类似于代码>可比的< />代码,这是你试图向错误方向移动的强烈暗示。,c++,C++" />

如何在C+中创建可比类+; 我想在C++中做一个接口。 如何在运算符重载语句中获取op2.radius值? 我希望类似的类可以用于其他,如矩形,直线等 #include <iostream> using namespace std; class Comparable { public: virtual bool operator > (Comparable& op2)=0; //virtual bool operator < (Comparable& op2)=0; //virtual bool operator == (Comparable& op2)=0; }; class Circle : public Comparable { int radius; public: Circle(int radius=1) { this->radius = radius; } int getRadius() { return radius; } bool operator > (Comparable& op2) { if (radius > op2.radius) // <-- here! return true; else return false; } }; template <class T> T bigger(T a, T b){ if (a > b) return a; else return b; } void main() { Circle waffle(10), pizza(20), y; y = bigger(waffle, pizza); cout << "the bigger one is " << y.getRadius() << endl; } #包括 使用名称空间std; 等级可比{ 公众: 虚拟布尔运算符>(可比&op2)=0; //虚拟布尔运算符radius=radius;} int getRadius(){return radius;} 布尔运算符>(可比&op2) { if(radius>op2.radius)//b)返回a; 其他的 返回b; } void main() { 圆华夫饼(10),比萨饼(20),y; y=更大(华夫饼、比萨饼); 如果你确定传递给它的唯一对象是Circle类型的,那么静态强制转换就足够了。如果不是这样,那么尝试使用动态强制转换来检查它是否是Circle对象。如果失败,那么只返回false。注:动态强制转换将把演出搞砸了 bool operator > (Comparable& op2) { Circle* foo = dynamic_cast<Circle*>(&op2); if (foo && (radius > foo->getRadius())) { return true; } else { return false; } } bool操作符>(可比&op2) { 圆圈*foo=动态_投射(&op2); 如果(foo&(radius>foo->getRadius()) { 返回true; } 其他的 { 返回false; } } >P> C++中,C++类不是java类,C++不是Java;它有自己的成语。在标准库中,你没有看到任何类似于代码>可比的< />代码,这是你试图向错误方向移动的强烈暗示。

如何在C+中创建可比类+; 我想在C++中做一个接口。 如何在运算符重载语句中获取op2.radius值? 我希望类似的类可以用于其他,如矩形,直线等 #include <iostream> using namespace std; class Comparable { public: virtual bool operator > (Comparable& op2)=0; //virtual bool operator < (Comparable& op2)=0; //virtual bool operator == (Comparable& op2)=0; }; class Circle : public Comparable { int radius; public: Circle(int radius=1) { this->radius = radius; } int getRadius() { return radius; } bool operator > (Comparable& op2) { if (radius > op2.radius) // <-- here! return true; else return false; } }; template <class T> T bigger(T a, T b){ if (a > b) return a; else return b; } void main() { Circle waffle(10), pizza(20), y; y = bigger(waffle, pizza); cout << "the bigger one is " << y.getRadius() << endl; } #包括 使用名称空间std; 等级可比{ 公众: 虚拟布尔运算符>(可比&op2)=0; //虚拟布尔运算符radius=radius;} int getRadius(){return radius;} 布尔运算符>(可比&op2) { if(radius>op2.radius)//b)返回a; 其他的 返回b; } void main() { 圆华夫饼(10),比萨饼(20),y; y=更大(华夫饼、比萨饼); 如果你确定传递给它的唯一对象是Circle类型的,那么静态强制转换就足够了。如果不是这样,那么尝试使用动态强制转换来检查它是否是Circle对象。如果失败,那么只返回false。注:动态强制转换将把演出搞砸了 bool operator > (Comparable& op2) { Circle* foo = dynamic_cast<Circle*>(&op2); if (foo && (radius > foo->getRadius())) { return true; } else { return false; } } bool操作符>(可比&op2) { 圆圈*foo=动态_投射(&op2); 如果(foo&(radius>foo->getRadius()) { 返回true; } 其他的 { 返回false; } } >P> C++中,C++类不是java类,C++不是Java;它有自己的成语。在标准库中,你没有看到任何类似于代码>可比的< />代码,这是你试图向错误方向移动的强烈暗示。,c++,C++,在您的特定情况下,biger应该做什么还不清楚。您想比较圆和三角形吗?如果不想,就没有圆和三角形都属于的Comparable接口。如果是,如何?按面积?(如果是,那么您可以有一个虚拟双区域()和一个非虚拟bool biger()这就叫它了)。那么圆和球体呢?你可以比较两个圆,或者两个球体,但是把一个圆和一个球体进行比较没有什么意义 同时拥有Circle::biger和Sphere::biger没有什么错,但它们不能同时是某个假设的公共基类或接口中同一虚拟函数的重写,即使您可以为该函数发明一个工作

在您的特定情况下,
biger
应该做什么还不清楚。您想比较圆和三角形吗?如果不想,就没有圆和三角形都属于的
Comparable
接口。如果是,如何?按面积?(如果是,那么您可以有一个
虚拟双区域()
和一个非虚拟
bool biger()
这就叫它了)。那么圆和球体呢?你可以比较两个圆,或者两个球体,但是把一个圆和一个球体进行比较没有什么意义

同时拥有
Circle::biger
Sphere::biger
没有什么错,但它们不能同时是某个假设的公共基类或接口中同一虚拟函数的重写,即使您可以为该函数发明一个工作签名。

我们可以利用将其放入
Comparable
类中。这样,我们保留了纯虚函数,但参数类型保持打开状态。不需要强制转换

#include <iostream>


template<typename T>
class Comparable {
public:
    virtual bool operator< (T const& other) const =0;
    virtual bool operator> (T const& other) const =0;
};

class Circle : public Comparable<Circle> {    //  note Circle itself is passed as a template parameter
public:
    Circle(int radius = 1) : radius(radius) {}

    bool operator< (Circle const& other) const { return this->radius < other.radius; }
    bool operator> (Circle const& other) const { return this->radius > other.radius; }

    friend std::ostream& operator<< (std::ostream& os, Circle const& c) {
        os << "Circle{.radius=" << c.radius << "}";
        return os;
    }

private:
    int radius;
};


int main()
{
    Circle c1{5};
    Circle c2{7};
    std::cout << std::boolalpha;
    std::cout << (c1 < c2) << std::endl;            //  true
    std::cout << std::max(c1, c2) << std::endl;     //  Circle{.radius=7} 
}
它们直接将另一个
作为参数

您可以使用
运算符==
类似地定义
相等的
抽象类。如果您的派生类(例如圆、数字、日期)可以在排序和相等性方面进行比较,则可以使用多重继承来继承
可比的
相等的


读者的练习:实现(一个接口)所有6个关系运算符(
=
!=
=
)对于
Circle
,比较其半径。可能的解决方案如下:。

您需要以某种方式在可比较的界面中提供对半径属性的访问,例如
virtual int getRadius()=0
,然后通过
this->getRadius()>op2.getRadius()对其进行比较
在Comparable中提供getRadius并不是他的问题的一般解决方案。我想Comparable类的原因是在多个类中使用它。矩形和直线是否可以相互比较,而圆形是否可以比较?如果可以,那么您应该描述这种比较的语义,以获得关于实现的建议。正如我提到的,虽然效率不高,但确实有效。另一方面,您确实需要强制转换,我只是在查看Java可比较的接口示例,我看到强制转换几乎无处不在。供您参考:@彩音M“比较只能发生在同一类型的两个对象之间”。这种方法也存在问题。例如,您可以有一个圆及其派生类ColoredCircle。您希望对它们进行比较,因为这有意义,但不能,因为它们不是同一类型@彩音M如果你说我不能自由地对我的类进行子类划分,不能将任何派生实例与你的库进行混合和匹配,那么你的库有一个设计问题,而不是我的。也就是说,它违反了LSP。不,你错过了它。施法没有失败。两个圆都是彩色的。但是原来相等的圆现在颜色不同,因此不相等,这打破了几何实际上,你的建议只是打破了等式的瞬变性。红色单位圆等于无色单位圆,无色单位圆等于绿色单位圆,但红色单位圆不等于绿色单位圆@彩音M如果我想让它们兼容?如果我想要相反的安排?如果我有两个以上的属性要比较?这个可比较的东西只是带来了更多的问题而不是答案。为什么不研究这个问题是如何用其他语言解决的?回答晚了,但是,''\_(ツ)_/“希望有帮助。
bool operator< (Circle const& other) const { return this->radius < other.radius; }
bool operator> (Circle const& other) const { return this->radius > other.radius; }