2010-07-03 62 views
3

如果我有一個類似數據庫的類,並且我想要這樣做:如何「雙重超載」操作員?

object [1] == otherObject;

如何「雙重過載」運算符[]和運算符==?

+3

只是單獨重載它們,編譯器會照顧它。有什麼問題? – Beta 2010-07-03 03:50:06

回答

8

object[1]返回someType的對象。您需要在someType上超載operator==

+0

好的,但我得到這個錯誤:「.. \ Database.cpp:36:錯誤:'數據庫::運營商[](無符號詮釋)中的'運算符=='不匹配const(x)== inRecord' 「 – cactusbin 2010-07-03 04:03:08

+2

如果你用一些相關的代碼發佈一個新問題,可能會更容易找出:) – Cogwheel 2010-07-03 04:05:56

+0

'inRecord'和'operator [] const'的返回值的類型是什麼?你是否已經爲'operator []'的返回值重載'operator =='作爲非const方法? – 2010-07-03 10:58:29

2

你所描述的只是兩個獨立的操作符重載。只要確保operator ==的參數匹配返回類型operator []

1

不要將運算符重載看作任何特殊的東西,它們就像正常的函數重載一樣。具有相同名稱的兩個函數可以重載,因爲它們具有不同的簽名。 (您不僅可以通過該方法的返回類型超載2起這不僅是運算符重載,它是在一般功能都超載。)

所以,簡單地是這樣的:

class B {}; 
class C {}; 
class A 
{ 
    bool operator==(const B& b) 
    { 
     //Put logic here 
     return true; 
    } 

    bool operator==(const C& c) 
    { 
     //Put logic here 
     return true; 
    } 

}; 

以上代碼將允許您將A類型的對象與B類型的對象進行比較。它還將允許您將A類型的對象與C類型的對象進行比較。

2

起初我真的很困惑這個問題的措辭,但現在我想我明白了。你不能直接這樣做;但是你可以達到同樣的效果。這個想法是讓operator[]返回一個代理對象。對於代理對象,您可以提供operator==以進行比較的自定義行爲。我已經看到std :: map的operator []在一些較老的,更晦澀的標準庫實現上以這種方式實現。

實例(假設對象[1]正常返回美孚&):

class SomeProxy 
{ 
private: 
    Foo* f; 
public: 
    explicit SomeProxy(Foo& i_f): f(&i_f) {} 
    operator Foo&() const {return *f;} 
}; 

SomeProxy Database::operator[](unsigned int n) 
{ 
    return SomeProxy(some_array + n); 
} 

bool operator==(const SomeProxy& lhs, const Foo& rhs) 
{ 
    // provide custom behavior 
} 


// also provide custom behavior for these: 
bool operator==(const SomeProxy& lhs, const SomeProxy& rhs); 
bool operator==(const Foo& lhs, const SomeProxy& rhs); 

注意:您要重載在這種情況下的比較操作的意義似乎有種奇(代理對象通常用於具有關聯結構的自定義分配行爲或用於花式元模式編程),但爲了進行比較,它們通常應提供與直接使用Foo相同的含義,例如不過,以下是實現方法:通過operator==獲取自定義行爲的方法,該方法僅適用於在同一個表達式中使用重載的operator[]

如果你想使這個徹底,那麼使SomeProxy的構造函數是私人的,並使數據庫成爲朋友。這樣,只有數據庫:可以創建這些對象(在這種情況下通過operator []),客戶端將無法複製它(他不應該這樣做),只從其中獲取Foo對象/引用或使用表達式中返回的代理。

+0

用於討論代理 – 2010-07-03 17:20:31