我有一个名为
AString
的课程。这是非常基本的:
class AString
{
public:
AString(const char *pSetString = NULL);
~AString();
bool operator==(const AString &pSetString);
...
protected:
char *pData;
int iDataSize;
}
现在我想编写这样的代码:
AString *myString = new AString("foo");
if (myString == "bar") {
/* and so on... */
}
但是现有的比较运算符仅支持
if (*myString == "bar")
如果我省略那个星号,编译器会不高兴。
有没有办法让比较运算符将
*AString
与const char*
进行比较?
不,没有。
要重载
operator==
,您必须提供用户定义类型作为操作数之一,并且指针(AString*
或 const char*
)不符合条件。operator==
,因此它不会考虑将其中一个参数转换为类类型。
除非你将它包装在某种智能指针类中,否则不会,但这会使语义变得奇怪。
if (*myString == "bar")
有什么问题吗?
我认为你想要的是错误的,因为它掩盖了 C++ 的类型系统。
myString
是 指向AString
的指针,而不是
AString
。不要试图隐藏它是一个指针的事实。这是丑陋错误的入口点,如果您在团队中编码,其他人只会感到困惑!
if (myString == "bar")
即使你让它发挥作用,对其他人来说也是非常混乱的。您正在将指向对象的指针与字符串文字进行比较。实现此功能的一种更清晰的方法是取消引用指针,并提供类似的重载
bool operator==(const char* pSetString);
[原答案有误,已更正如下]
正如 Oli Charlesworth 在下面的评论中指出的,这是不可能的。
您需要定义一个运算符,例如
bool operator==(const AString *as, const char *cs); // Note: C++ will not do that
但是不能重载运算符,除非其参数之一是非原始类型 - 并且指针(指向 AString 的指针和指向 char 的指针)都是原始类型。