Ошибки, баги, вопросы - страница 1357

 
Да и кстати чё-то я не понял из приведённого кода, в каком там месте будет вызываться operator== ?    Там идёт просто сравнение двух лонгов и всё
 
Alexey Navoykov:
Да и кстати чё-то я не понял из приведённого кода, в каком там месте будет вызываться operator== ?    Там идёт просто сравнение двух лонгов и всё
class A { public:
        bool operator==( const A& ) { Print(__FUNCTION__); return true; }
};
class B {};
void OnStart()
{
        bool res;
        A *a1, *a2;
        B *b1, *b2;
        res = a1 == a2; //сейчас сравниваются указатели
                        //предлагается вызывать operator==()
        res = b1 == b2; //сравниваются указатели (предложение здесь ничего не меняет, поскольку нет B::operator==)
        res = IsEqualPointer( a1, a2 ); //сравниваются указатели
}
 IsEqualPointer может быть как шаблоном, так и общей функцией подобной ::GetPointer 
 
A100:

...

IsEqualPointer может быть как шаблоном, так и общей функцией подобной ::GetPointer 

Что-то я совсем перестал вас понимать.  Не могли бы пояснить по-человечески, что вы пытаетесь сделать?   Приведённый код у вас с ошибками (оператор== не имеет ни аргумента, ни возвращаемого значения), сложно что-то понять из всего этого.

Сразу скажу, проблема сравнения/присвоения указателей и не стояла никогда, для этого достаточно GetPointer(a)==GetPointer(b).  Поэтому задача относится только к сравнению/присвоению самих объектов.  Т.е. гарантированно провести эти операции, независимо от того, чем представлены эти объекты:  указателями или ссылками

 
Alexey Navoykov:

Приведённый код у вас с ошибками (оператор== не имеет ни аргумента, ни возвращаемого значения), сложно что-то понять из всего этого.

Поправил. Предлагается и для указателей вызывать operator==(...) если он определен, тогда GetPointer(a)==GetPointer(b) приведет к вызову a.operator==( b ), поэтому для сравнения указателей на равенство предлагается использовать IsEqualPointer
 
A100:
 GetPointer(a)==GetPointer(b) приведет к вызову  a.operator==( b )
С чего это вдруг?
 
Alexey Navoykov:

Кстати, а как насчёт введения в MQL операторов * и & для возможности явного обращения к объекту в первом случае, и взятия указателя объекта во втором (вместо громоздкого GetPointer).   Причём звёздочка необходима просто позарез.  Её заменить в языке нечем.  Без этого невозможно контролировать такие ситуации, как привёл A100 чуть выше, что вместо самих объекта производятся какие-то действия с указателями.  Лично для меня это постоянная проблема, приходится всегда быть начеку, либо везде явно указывать  A.operator=(B),  A.operator!=(B), т.е. теряется лаконичность, и перегрузка операторов фактически лишается смысла.

Я как-то уже поднимал эту проблему, но тема заглохла.  Давайте уже добьём этот вопрос наконец.

Спасибо за сообщение, если Вы имеете в виду следующее использование:
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

*pf1!=*pf2
*pf1=*pf2;

То с этим я согласен, обязательно подниму данный вопрос и мы это обсудим.
 
Alexey Navoykov:
С чего это вдруг?
class A { public:
        bool operator ==( const A& ) { Print( __FUNCSIG__ ); return true; }
        bool operator  <( const A& ) { Print( __FUNCSIG__ ); return true; }
};
void OnStart()
{
        bool res;
        A a1, a2;
        res = GetPointer( a1 ) == GetPointer( a2 ); //сейчас сравниваются указатели, а будет вызываться operator==, как сейчас происходит для следующей строки
        res = GetPointer( a1 )  < GetPointer( a2 ); //вызывается operator<
}
Если уравнять operator== с operator<, то и результат уравняется
 
A100:
...
Если уравнять operator== с operator<, то и результат уравняется

Уважаемый, ну вы ведь даже не проверяли то, что предлагаете!  Равно как и в предыдущем случае, когда в коде были явные ошибки, т.е. вы даже не пытались это компилировать.  Набросали что-то на коленке, какие-то свои мысли, типа "хавайте пока я добрый, не жалко"... Разве так можно?  Давайте не будем заниматься подобной ерундой.

Я сам постоянно сравниваю указатели и перегружаю операторы, и никогда не было того, о чём вы сейчас фантазируете.  Вот и сейчас проверив ваш код, никаких чудес не случилось,  оператор== не запускается, как и положено.

 
Alexey Navoykov:

Вот и сейчас проверив ваш код, никаких чудес не случилось,  оператор== не запускается, как и положено.

Суть предложения как раз и состоит в том чтобы запускался. Я веду речь об изменениях в существующую систему.
 
A100:
Суть предложения как раз и состоит в том чтобы запускался.

Это ещё зачем?  Всё с ног на голову.

Логичнее как раз наоборот: чтобы < и > приводило к сравнению указателей.