Сравнение указателей для самостоятельного назначения - PullRequest
1 голос
/ 20 октября 2010

Я пытаюсь перегрузить оператор = в простом классе C ++ с именем Set, который содержит динамический массив целых чисел.Для оператора = я сначала хочу проверить самопредставление, поэтому я хотел сравнить 2 указателя, чтобы убедиться, что они имеют одинаковый адрес памяти.Вот код:

Set& Set::operator=(const Set& setEqual)
{
//first check for self assignment
if(setEqual == this*)
    cout << "this is self assignment";
}

Ошибка вылетела: error: expected primary-expression before ')' token

Я полагаю, что я снова неправильно понимаю указатели, так что если кто-то может указать (ха!) На меняправильное направление, я был бы признателен.

Ответы [ 3 ]

6 голосов
/ 20 октября 2010

Ошибка из-за того, что this* недопустимо - * является либо инфиксом (при умножении), либо префиксом (в указателях разыменования).

Возможно, вы хотите &setEqual == this- это присваивание от объекта с тем же адресом памяти или setEqual==*this - сравнение равенства с использованием того, что operator== вы определили

4 голосов
/ 20 октября 2010

Для обнаружения самоназначения вам нужно

if(&setEqual == this)

, вы никогда не должны использовать

if(setEqual == *this)

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

4 голосов
/ 20 октября 2010

Если вы хотите сравнить адрес указанной вещи, вы действительно хотите это:

Set& Set::operator=(const Set& setEqual)
{
//first check for self assignment
if(&setEqual == this)
    cout << "this is self assignment";
}

Использование (setEqual==*this), как предложено некоторыми решениями, сравнивает, если объекты равны operator==.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...