Как перегрузить оператор == () для указателя на класс? - PullRequest
7 голосов
/ 06 октября 2010

У меня есть класс с именем 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*?

Ответы [ 5 ]

11 голосов
/ 06 октября 2010

Нет, если вы не заключите его в какой-нибудь класс интеллектуальных указателей, но это сделает семантику страннойЧто не так с if (*myString == "bar")?

9 голосов
/ 06 октября 2010

Нет, нет.

Для перегрузки operator== необходимо указать пользовательский тип в качестве одного из операндов, а указатель (либо AString*, либо const char*) не подходит,А при сравнении двух указателей компилятор имеет очень адекватную встроенную operator==, поэтому он не будет рассматривать преобразование одного из аргументов в тип класса.

3 голосов
/ 06 октября 2010
 if (myString == "bar")

, даже если вы заставите его работать, очень запутывает других.Вы сравниваете указатель на объект со строковым литералом.Более понятный способ получить эту работу - разыменовать указатель и обеспечить перегрузку, например

bool operator==(const char* pSetString);
3 голосов
/ 06 октября 2010

Я думаю, что то, что вы хотите, неверно, так как оно скрывает систему типов C ++.myString - это указатель на AString, а не AString.Не пытайтесь скрыть тот факт, что это указатель.Это отправная точка для уродливых ошибок, и если вы программируете в команде, все остальные будут в замешательстве!

2 голосов
/ 06 октября 2010

[Первоначальный ответ был неверным и поэтому исправлен ниже]

Как отметил Оли Чарльзуорт в комментарии ниже, это невозможно.

Вам необходимо определить оператор, например

   bool operator==(const AString *as, const char *cs); // Note: C++ will not do that

но вы не можете перегрузить оператор, если один из его параметров не является примитивным типом, а указатели (оба указателя на AString и указатели на char) являются примитивными типами.

...