回答
object[1]
返回someType
的对象。您需要在someType
上超载operator==
。
好的,但我得到这个错误:“.. \ Database.cpp:36:错误:'数据库::运营商[](无符号诠释)中的'运算符=='不匹配const(x)== inRecord' “ – cactusbin 2010-07-03 04:03:08
如果你用一些相关的代码发布一个新问题,可能会更容易找出:) – Cogwheel 2010-07-03 04:05:56
'inRecord'和'operator [] const'的返回值的类型是什么?你是否已经为'operator []'的返回值重载'operator =='作为非const方法? – 2010-07-03 10:58:29
你所描述的只是两个独立的操作符重载。只要确保operator ==
的参数匹配返回类型operator []
。
不要将运算符重载看作任何特殊的东西,它们就像正常的函数重载一样。具有相同名称的两个函数可以重载,因为它们具有不同的签名。 (您不仅可以通过该方法的返回类型超载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
类型的对象进行比较。
起初我真的很困惑这个问题的措辞,但现在我想我明白了。你不能直接这样做;但是你可以达到同样的效果。这个想法是让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对象/引用或使用表达式中返回的代理。
用于讨论代理 – 2010-07-03 17:20:31
- 1. ()操作员超载
- 2. 操作员超载()
- 3. 操作员超载故障
- 4. 超载对其操作(操作员*())
- 5. 操作员新操作员和新操作员不能重载?
- 6. 操作员超载错误“与操作员错误不匹配”
- 7. 重载+操作统计员
- 8. 重载操作员=错误
- 9. 重载操作员帮助?
- 10. 有关操作员超载的问题
- 11. C++超载+操作员朋友函数
- 12. 重载操作员的套集
- 13. 成员函数vs操作符重载
- 14. 重载新的操作员问题
- 15. 操作员使用模板重载
- 16. 重载<<操作员错误
- 17. SAL批注和新操作员重载
- 18. 重载操作员身体的奥秘
- 19. 超载操作员和编写操纵器?
- 20. 重载的操作员试图把另一个重载的操作员作为参数
- 21. 错误操作符<<重载 - 没有操作员发现
- 22. 如何重载<<操作符以打印类成员?
- 23. 作为非朋友帮手操作员超载cout
- 24. 重载=操作
- 25. 重载操作
- 26. 超载引用操作
- 27. .net操作符超载
- 28. 写C++操作符超载?
- 29. C++超载[]操作不
- 30. 重写+ =操作员C++
只是单独重载它们,编译器会照顾它。有什么问题? – Beta 2010-07-03 03:50:06