为什么我的运算符重载没有调用“<”当我使用指针?

时间:2013-10-08 01:45:41

标签: c++ pointers reference operator-overloading

当我重载"==""!="运算符时,我将指针作为参数传递,并调用重载函数,我得到了我期望的结果但是在调试中我发现在调用期间{{ 1}},我的重载cout << (fruit1 < fruit);方法没有被调用。为什么"<"运算符是唯一没有超载的运算符?我已经传递了一个引用参数来测试它并在函数调用中取消引用"<"fruit,它起作用,因此函数本身可以工作。它是那些个体运算符的属性还是fruit1"!="方法是内联的,允许它们工作?

CPP

#include“Fruit.h”

"=="

ħ

using namespace std;
Fruit::Fruit(const Fruit &temp )
{
    name = temp.name;
    for(int i = 0; i < CODE_LEN - 1; i++)
    {
        code[i] = temp.code[i];
    }
}
bool  Fruit::operator<(const Fruit *tempFruit)
{
    int i = 0;
    while(name[i] != NULL && tempFruit->name[i] != NULL)  
    {
        if((int)name[i] < (int)tempFruit->name[i])
            return true;
        else if((int)name[i] > (int)tempFruit->name[i])
            return false;
        i++;
    }
    return false;
}
std::ostream & operator<<(std::ostream &os, const Fruit *printFruit)
{
    int i = 0;
    os << setiosflags(ios::left) << setw(MAX_NAME_LEN) << printFruit->name << " ";
    for(int i = 0; i < CODE_LEN; i++)
    {
        os << printFruit->code[i];
    }
    os << endl;
    return os;
}

std::istream & operator>>(std::istream &is, Fruit *readFruit)
{

    string tempString;
    is >> tempString;
    int size = tempString.length();
    readFruit->name = new char[tempString.length()];
    for(int i = 0; i <= (int)tempString.length(); i++)
    {
        readFruit->name[i] = tempString[i];
    }
    readFruit->name[(int)tempString.length()] = '\0';
    for(int i =0; i < CODE_LEN; i++)
    {
        is >> readFruit->code[i];
    }
    return is;
}
void main()
{
    Fruit *fruit = new Fruit();
    Fruit *fruit1 = new Fruit();
    cin >> fruit;
    cin >> fruit1;
    cout << (fruit == fruit1);
    cout << (fruit != fruit1);
    cout << (fruit1 < fruit);
    cout << "...";  
}

1 个答案:

答案 0 :(得分:5)

您的operator<是一个成员函数,这意味着它适用于Fruit, const Fruit*类型,并且您尝试将其传递给Fruit*, Fruit*

当您将运算符声明为成员函数时,左侧参数隐含为Fruit。如果你想要别的东西,那么你必须建立一个全局运算符。不幸的是,你需要一个类或枚举类型作为参数,所以你不能有两个指针。

解决此限制的一种方法。而不是

cout << (fruit1 < fruit);

使用

cout << (*fruit1 < fruit);

我也想让你知道这个:

(fruit == fruit1)

比较指针而不是它们指向的内容。在您的情况下,这是两个不同的对象,因此指针比较将始终返回false。