我正在尝试比较C++中不同类别的对象。
如果删除section3,一切都会很好。但是我想知道如何编辑比较运算符==!=以使其正常工作而不会出现任何错误?
我得到的错误是"no match for 'operator==' (operand types are 'Fruit' and 'Plant') "
这是我的代码:

#include <iostream>
#include <string>
class Plant
{
public:
    Plant(std::string name) : type_(name)
    { }

    bool operator==(const Plant &that) const
    { return type_ == that.type_; }

    bool operator!=(const Plant &that) const
    { return !operator==(that); }

    void print()
    { std::cout << type_ << std::endl; }

protected:
    std::string type_;
};

class Fruit: public Plant
{
public:
    Fruit(std::string name, std::string taste)
        : Plant(name)
        , taste_(taste)
    { }

    bool operator==(const Fruit& that) const
    {
        return ( (taste_ == that.taste_) && (Plant::operator==(that)) );
    }

    bool operator!=(const Fruit& that) const
    {
        return !operator==(that);
    }

    void print()
    {
        Plant::print();
        std::cout << taste_ << std::endl;
    }

private:
    std::string taste_;
};


int main()
{
    Plant a("Maple");
    a.print();
    Plant b("Maple");

    if (a == b)
    {
        std::cout << "a and b are equal" << std::endl;
    }
    else
    {
        std::cout << "a and b are not equal" << std::endl;
    }

    Fruit c("Apple","sweet");
    c.print();
    Fruit d("Apple","sweet");

    if (c == d)
    {
        std::cout << "c and d are equal" << std::endl;
    }
    else
    {
        std::cout << "c and d are not equal" << std::endl;
    }

    if (a == c)
    {
        std::cout << "a and c are equal" << std::endl;
    }
    else
    {
        std::cout << "a and c are not equal" << std::endl;
    }

    /* Section 3 */
    if (c == a)
    { std::cout <<"c and a are equal\n"<< std::endl; }
    else
    { std::cout <<"c and a are not equal\n"<< std::endl; }

    if (a != c)
    { std::cout <<"c and a are not equal\n"<< std::endl; }
    else
    { std::cout <<"c and a are equal\n"<< std::endl; }
    return 0;
}

谢谢 ..

最佳答案

您可以添加非成员函数,

bool operator==(Fruit const& f, Plant const& p)
{
   return false;
}

bool operator!=(Fruit const& f, Plant const& p)
{
   return !(f == p);
}

这将适用于Plant的一种子类型。这种方法是不可扩展的。如果创建更多的Plant子类型,则需要使用其他方法。

10-08 11:50