我有一个名为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*
进行比较?
答案 0 :(得分:11)
除非你将它包装在某种智能指针类中,否则会使语义变得奇怪。 if (*myString == "bar")
出了什么问题?
答案 1 :(得分:9)
不,没有。
要重载operator==
,您必须提供用户定义的类型作为操作数之一,并且指针(AString*
或const char*
)不符合条件。
当比较两个指针时,编译器有一个非常适当的内置operator==
,所以它不会考虑将其中一个参数转换为类类型。
答案 2 :(得分:3)
我认为你想要的是错误的,因为它模糊了C ++的类型系统。 myString
指向<{1}}的指针,而不是AString
。不要试图隐藏它是指针的事实。这是丑陋的错误的切入点,如果你在一个团队中编码,其他所有人都会感到困惑!
答案 3 :(得分:3)
if (myString == "bar")
即使你让它上班,也会让别人感到困惑。您正在将指向对象的指针与字符串文字进行比较。让这个工作更清晰的方法是取消引用指针,并提供像
这样的重载bool operator==(const char* pSetString);
答案 4 :(得分:2)
[原始答案错误,因此在下面更正]
正如Oli Charlesworth所指出的,在下面的评论中,这是不可能的。
您需要定义类似
的运算符 bool operator==(const AString *as, const char *cs); // Note: C++ will not do that
但是你不能重载运算符,除非它的一个参数是非基本类型 - 而指针(指向AString和指向char的指针)都是基本类型。