二进制运算符重载C ++

时间:2012-03-06 17:06:30

标签: c++ operator-overloading

我正在尝试重载以下运算符,以使用快速排序或可能的合并排序算法对字符串数组进行排序。我将所有函数都放在一个类中,但是我得到了“这个操作符函数的参数太多”错误。实际上,它只接受一个参数。我查找了问题并在论坛中有人说你在类中重载一个操作符时只能使用一个参数。这对我来说没什么意义。我正在尝试比较字符串,所以我需要两个参数进行重载。我是否应该超越班级以外的操作员,这将如何运作?

这是我的代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class Preprocessing
{

public:

void readFile(string list[], int size);
void quickSort(int list[], int lowerBound, int upperBound);
void swapItem(int &a, int &b);

//These are the overloading functions I'm trying to implement
bool operator<=(string a, string b);
bool operator<(string a, string b);
bool operator>(string a, string b);
};

void Preprocessing::readFile(string list[], int size)
{
ifstream myFile;
myFile.open("words.txt");

for (int i = 0; i < size; i++)
{
    myFile >> list[i];
}

myFile.close();
}

void Preprocessing::quickSort(int list[], int lowerBound, int upperBound)
{
    int i, j, pivot;

    i = lowerBound;
    j = upperBound;

    pivot = list[(i + j) / 2];

    while (i <= j)
    {
        while(list[i] < pivot)
        {
            i = i + 1;
        }
        while (list[j] > pivot)
        {
            j = j - 1;
        }
        if (i <= j)
        {
            swapItem(list[i], list[j]);
            i = i + 1;
            j = j - 1;
        }//end if
    }//end outter while
    if (lowerBound < j)
    {
        quickSort(list, lowerBound, j);
    }
    if (i < upperBound)
    {
        quickSort(list, i, upperBound);
    }//end recursive if
}//end function

void Preprocessing::swapItem(int &a, int &b){
    int tmp;

    tmp = a;
    a = b;
    b = tmp;
}

bool Preprocessing::operator<=(string a, string b)
{
if (a.compare(b) > 0)
    return false;
else if (a.compare(b) == 0)
    return true;
else
    return true;
}

bool Preprocessing::operator<(string a, string b)
{
if (a.compare(b) > 0)
    return false;
else if (a.compare(b) == 0)
    return true;
else
    return true;
}

bool Preprocessing::operator>(string a, string b)
{
if (a.compare(b) > 0)
    return false;
else if (a.compare(b) == 0)
    return true;
else
    return true;
}

4 个答案:

答案 0 :(得分:5)

运营商的签名不正确:

bool operator<=(string a, string b);
bool operator<(string a, string b);
bool operator>(string a, string b);
  1. 当你重载一个操作符 - 并将它实现为一个成员函数时,它应该只接受一个参数(另一个 thing 来比较)
  2. 如果是非成员函数(即朋友),那么你可以提供两个参数,但是它不能匹配现有的运算符(已经为std::string定义了一个),并且通常应该接受你的类作为lhs和用于测试的rhs。

答案 1 :(得分:1)

类中的operator,无论它是什么,都具有将该运算符应用于该类的实例以及可选地应用于参数的特殊含义。

在您的示例中,operator<=应该将Preprocessing类的实例与string进行比较。

class Preprocessing
{
public:
    bool operator<=(string a);

private:
    string aStringField;
}

通常,您在运算符方法体内使用this来将实例与参数进行比较:

bool Preprocessing::operator<=(string a)
{
   return this->aStringField.length() <= a.length();
}

你用它来称呼它:

Preprocessing p;
if ( p <= "a string" )
    // ...

相当于:

Preprocessing p;
if ( p.operator<=("a string") )
    // ...

如果您想提供一个不需要调用“点语法”的运算符,那么您正在寻找类外存在的friend运算符。

class Preprocessing
    {
    public:
        friend ostream& operator<<(ostream&, const Preprocessing&);

    private:
        string aStringField;
    }

答案 2 :(得分:0)

它只需要一个参数,因为左侧是this指针传递的。

答案 3 :(得分:0)

要使运算符重载,运算符必须是左手操作数的方法。 C ++根据参数类型(操作数)选择函数(和运算符)。在类中,左操作数是类的实例,可用作this指针,因此只能将右操作数指定为操作符的参数。

在您的示例中,您可以执行此操作:

class Preprocessing {
    public:
        bool operator<=(string b);
};

将定义<=运算符,用于将Preprocessing个对象与字符串进行比较。如果需要重载字符串比较运算符,则需要修改std::string类,这是我所不知道的。