2010-10-06 5 views
6

У меня есть класс под названием AString. Это довольно простой:Как перегрузить operator ==() для указателя на класс?

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*?

+4

Почему вы динамически выделяете 'myString'? Почему не 'operator ==' a 'const' член? Или лучше, почему это вообще член? Или даже лучше, почему вы пишете свой собственный класс строк? – sbi

+1

(1) Я не должен. Это была ошибка. (2) Не могли бы вы рассказать об этом? (3) Почему бы не стать членом? (4) Поскольку целевая платформа является встроенной системой, которая не имеет собственного класса строк. – bastibe

+0

2. Если вы не сделаете его const, то он не будет работать для const AString: s, 3. Потому что ему не нужно быть членом и приведет к лучшей инкапсуляции, 4, что вы имеете в виду без «родной строки» класс"? у вас есть std :: string. – ronag

ответ

8

Нет, нет.

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

2

[Подлинный ответ был неправильным, и, таким образом, исправленные ниже]

Как отметил Оля Charlesworth, в комментариях ниже, это невозможно.

Вы должны были бы определить оператор, как

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

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

+1

Но это может привести к дальнейшим неожиданностям при сравнении указателей потом! – Benoit

+2

Вы не можете перегружать операторов, если один из них не является примитивным типом. –

+0

... это должно сказать «операторы, не являющиеся членами». –

10

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

3

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

3
if (myString == "bar") 

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

bool operator==(const char* pSetString); 

 Смежные вопросы

  • Нет связанных вопросов^_^