簡體   English   中英

在C ++中重載<運算符的問題

[英]Problem overloading the < operator in C++

我有一個學生對象的向量,我想使用#include <algorithm>sort(list.begin(), list.end());

為了做到這一點,我理解我需要重載“<”運算符,但在嘗試(並失敗)使用在線建議的幾種方法后,我的想法已經用完了。

這是我最近的嘗試:

在Student.h ...

...
using namespace std;
class Student
{
    friend bool operator <(const Student& first, const Student& second);
    public:
    ...
    private:
    ...
};

在Student.cpp中......

...
#include "Student.h"
using namespace std;
...
bool operator <(const Student& first, const Student& second)
{
    return first.Name() < second.Name();
}

其中“Name()”是一個返回字符串的常量函數。

程序編譯並運行,但我的操作符函數在排序期間從不被調用,當我嘗試比較兩個學生對象時,比如s1 < s2我得到了一個“錯誤:找不到重載的操作符”

我怎樣才能正確地重載此運算符,以便我的排序可以按照我的意圖運行?

您沒有說明您使用的是哪種編譯器,但我懷疑您使用的是最近實現“朋友不是聲明”規則的編譯器。 類中的friend語句不作為函數聲明; 包含Student.h的其他模塊看不到該函數的任何聲明。 它只在Student.cpp文件中可見。 (較舊的編譯器沒有此規則,並將朋友聲明視為函數聲明。)

該函數不需要是朋友,因為它不使用Student類的任何私有成員(我假設Name()是公共的)。 在類外移動函數聲明,並將“friend”替換為“extern”,它應該可以工作。

可以使操作員成為成員函數,如上面提到的一些海報,但是沒有必要。 使比較運算符成員函數通常不受歡迎,因為這意味着兩個參數不是對稱處理的(一個是不可見的“this”參數,另一個是正常的函數參數),在某些情況下會導致令人驚訝的結果(例如,可以對參數應用不同類型的轉換)。

我不會在這里使用朋友,我不確定它是否有效。 我會用的是......

class Student
{
  public:
    bool operator< (const Student& second) const;
};

bool Student::operator< (const Student& second) const
{
  return (Name() < second.Name());
}

注意尾隨const,表示在operator <,*中這是常量。

編輯我不能刪除這個答案,因為它已被接受,但如果可以,我會。 我也無法用正確的替換它。 請參閱下面的Drew Dormanns評論, Ross Smiths回答

順便說一句,有了這個簡單的函數,我個人會這樣做,除非樣式指南禁止在類定義中定義函數:

class Student
{
    friend bool operator <(const Student& first, const Student& second)
    {
        return first.Name() < second.Name();
    }
    ...
};

這種形式的“朋友”聲明允許您在類的主體內定義一個非成員 operator< 它仍然是朋友,因此如果需要, Name()可以是私有的。

那么,你可以做一個內部運營商:

class Student
{
    public:
    bool operator <(const Student& second) const;
    ...
    private:
    ...
};

通過比較'this'和second的實現。 我心中的問題是:'Name'方法是否具有const風格? 因為如果沒有,那么你就不能編寫一個使用它的const方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM