2

"=="and演算子をオーバーロードすると"!="、パラメーターとしてポインターが渡され、オーバーロードされた関数が呼び出され、期待どおりの結果が得られますが、デバッグ中に呼び出し中cout << (fruit1 < fruit);に、オーバーロード"<"されたメソッドが呼び出されていないことがわかりました。"<"オペレーターだけがオーバーロードされていないのはなぜですか? 代わりに参照パラメーターを渡してテストし、参照解除fruitfruit1、関数呼び出しで機能させたので、関数自体が機能しました。"!="これらの個々の演算子のプロパティですか、それともメソッドと"=="メソッドがインラインであるという事実がそれらを機能させているのでしょうか?

CPP

#include "フルーツ.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 << "...";  
}

H

#ifndef _FRUIT_H
#define _FRUIT_H
#include <cstring>
#include <sstream>
#include <iomanip>
#include <iostream>
#include "LeakWatcher.h"
enum { CODE_LEN = 4 }; 
enum { MAX_NAME_LEN = 30 };
class Fruit
{
private:
    char *name;
    char code[CODE_LEN];
public:
    Fruit(const Fruit &temp);
    Fruit(){name = NULL;};
    bool operator<(const Fruit *other);
   friend std::ostream & operator<<(std::ostream &os, const Fruit *printFruit);
    bool operator==(const Fruit *other){return name == other->name;};
   bool operator!=(const Fruit *other){return name != other->name;};
    friend std::istream & operator>>(std::istream& is, Fruit *readFruit);
};

#endif
4

1 に答える 1

6

Youroperator<はメンバー関数です。つまり、 types に対して機能し、Fruit, const Fruit*渡そうとしますFruit*, Fruit*

演算子をメンバー関数として宣言すると、左のパラメーターは暗黙的に になりますFruit。他の何かが必要な場合は、グローバル オペレーターを作成する必要があります。残念ながら、パラメーターとしてクラスまたは列挙型が必要なため、2 つのポインターを持つことはできません。

この制限を回避する 1 つの方法。それ以外の

cout << (fruit1 < fruit);

使用する

cout << (*fruit1 < fruit);

また、次のことも知っておいてください。

(fruit == fruit1)

ポインターが指すものではなく、ポインターを比較します。あなたの場合、これらは 2 つの異なるオブジェクトであるため、ポインターの比較は常に false を返します。

于 2013-10-08T01:49:34.393 に答える