//--------- как былоclass A
{
int m;
int f1() {return m;} // нужно дать к нему доступ классу Bpublic:
A(int a): m(a) {}
};
class B {};
让我们这样重写:
class A;
class B
{
private:
class AB
{
public:
virtualint CallAf1(A&) const = 0;
AB() {ABptr = &this;}
} static *ABptr;
// внутри B используем этот метод для получения доступа к A::f1()staticint CallAf1(A & obj)
{
return ABptr.CallAf1(obj);
}
public:
class AB2: AB {};
// вспомогательный метод - только для проверкиstaticvoid _f1_test(A & obj)
{
Print("test ", CallAf1(obj));
}
};
B::AB *B::ABptr = NULL;
class A
{
int m;
int f1() {return m;}
public:
A(int a): m(a) {}
//-- добавленоprivate:
class AB3: B::AB2
{
int CallAf1(A &obj) const {return obj.f1();}
} staticconst ABlink;
};
const A::AB3 A::ABlink;
要在 B 中调用 (A)a.f1(),请调用 CallAf1(a)。如果 f1() 有参数,我们将其添加到 CallAf1()。
测试:
voidOnStart()
{
A f(2);
B::_f1_test(f);
}
您可以将 CallAf1() 设置为受保护的,但这会在访问权限方面造成很大的漏洞--您可以在代码的任何地方创建类 B 的后代,并在其中创建一个公共方法来调用 CallAf1() --也就是说,每个人都可以访问 A::f1()。
附注:这种结构非常繁琐(如果您愿意,可以将其塞入宏中),但它比 friend C++ 有一个优点:它不提供对所有类成员 的访问权限,而只提供对选定成员 的访问权限。
英语(原文):我想提出一个 MQL 语言功能请求。如果这不是正确的主题,请告诉我。原始请求在英语论坛 ...
俄语(Google 翻译):我想申请 MQL 语言功能。 如果这不是正确的主题,请告诉我。 原始请求在英文论坛 ...
如何用 一行填充数组?
clr_struct clr[] = {{0x999999}, {0x999999}};还有一个关于访问权限的生活小窍门:如果你有一个不可抗拒的愿望,想让一个类的私有字段/函数的访问权限给另一个类,你可以使用标准的 MQL 工具做以下事情:
我们需要:从 B 访问 A::f1()
让我们这样重写:
要在 B 中调用 (A)a.f1(),请调用 CallAf1(a)。如果 f1() 有参数,我们将其添加到 CallAf1()。
测试:
您可以将 CallAf1() 设置为受保护的,但这会在访问权限方面造成很大的漏洞--您可以在代码的任何地方创建类 B 的后代,并在其中创建一个公共方法来调用 CallAf1() --也就是说,每个人都可以访问 A::f1()。
附注:这种结构非常繁琐(如果您愿意,可以将其塞入宏中),但它比 friend C++ 有一个优点:它不提供对所有类成员 的访问权限,而只提供对选定成员 的访问权限。
还有一个关于访问权限的生活小窍门:如果您迫切希望将一个类的私有字段/函数的访问权限授予另一个类,您可以使用标准的 MQL 工具来实现这一目的
花了很长时间才进入状态...虚拟化做得不错,谢谢!
REASON_ACCOUNT(即使账户没有更改,只是重新登录) 时,Expert Advisor 将完全卸载并加载新的副本。
因此,OnDeinit 中的 ExpertRemove 不会影响新的副本,因为它会触及未加载的副本。
重新登录后的结果。
退出后,新的 EA 副本等待超过一秒(最长两秒)才能启动。等待时间如此之长的原因是什么?
SymbolInfoTick 每次都会返回最新的刻度线。也就是说,不跳过指标的所谓刻度线收集,说得难听点,是有问题的。
证明不可能通过指标收集刻度线(不跳转)。
结果。
交易、自动交易系统和交易策略测试论坛
错误、错误、问题
fxsaber, 2023.02.14 13:11
不幸的是,MQL4 还不能完成这种工作。