错误、漏洞、问题 - 页 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的通用函数。

我完全不明白你的意思,你能用人话解释一下你想做什么吗? 给出的代码有错误(operator==既没有参数,也没有返回值),很难从这些东西中理解到什么。

让我马上告诉你,比较/分配指针的问题以前从未存在过,GetPointer(a)==GetPointer(b)就足够了。 所以这个任务只涉及对象本身的比较/分配,也就是说,无论这些对象是用指针还是引用表示,它都能保证执行这些操作

 
Alexey Navoykov:

你给出的代码有错误(operator==没有参数或返回值),很难从这一切中理解什么。

纠正了。建议对指针也调用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:
这句话的重点正是要引发它。

那是干什么的?

反过来说更有意义:<和>应该导致指针的比较。