2010-07-03 58 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