//--------- как было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;
English (original): MQLの言語機能について要望を出したいと思います。もしこのスレッドが適切でなければ、教えてください。元のリクエストは英語フォーラムにあります ...
ロシア語(Google翻訳):MQLの言語機能に関する要望を出したいと思います。 このスレッドが適切でない場合は、私に知らせてください。 元のリクエストは英語フォーラムにあります ...
配列を 1行で埋めるには?
アクセス権に関するライフハックをもうひとつ:あるクラスのプライベート・フィールドや関数へのアクセスを別のクラスに与えたいという欲求が抑えられない場合、標準的なMQLツールを使って以下のようにすることができる:
BからA::f1()にアクセスできるようにする。
このように書き換えてみよう:
Bの内部で(A)a.f1()を呼び出すには、CallAf1(a)を呼び出す。f1()にパラメータがある場合は、それをCallAf1()に追加する。
テスト:
CallAf1()をprotectedにすることもできるが、それはアクセス権に大きな穴を開けることになる。コード内のどこでも、クラスBの子孫を作り、その中にCallAf1()を呼び出すpublicメソッドを作ることができる。
P.S.この構文は非常に面倒ですが(必要であればマクロに詰め込むこともできます)、フレンドC++より優れている点がひとつあります。
アクセス権に関するライフハックをもうひとつ:あるクラスのプライベートなフィールドや関数へのアクセス権を別のクラスにも与えたいという欲求が抑えられない場合、標準的なMQLツールを使ってこれを行うことができます。
この世界に入るのに、ずいぶん時間がかかったよ...。仮想化はいい手だ!
REASON_ACCOUNTが 実行されると(口座が変更されず、 再ログイン されただけでも)、Expert Advisorは完全にアンロードされ、新しいコピーがロードさ れます。
このため、OnDeinit の ExpertRemove は新しいコピーには影響しません。
再ログイン後の結果。
Deinit後、新しいEAコピーの起動が1秒以上(最大2秒)待たされます。このような長い待ち時間の理由は何ですか?また、待ち時間を短縮することは可能ですか?
SymbolInfoTickは この3回の呼び出しのそれぞれで最新のティックを返します。つまり、インジケータをスキップすることなくティックを収集することは、控えめに言っても疑わしい。
インジケータによる(スキップなしの)ティック収集が不可能であることの証明。
結果。
取引、自動取引システム、取引戦略のテストに関するフォーラム
エラー、バグ、質問
fxsaber, 2023.02.14 13:11
残念ながら、MQL4ではこのような作業はまだできません。