#property strict/******************************************************************************/class A {
public:
/******************************************************************************/
A() {
Print("class A: Конструктор по умолчанию");
}
/******************************************************************************/
A(const A &a) {
Print("class A: Конструктор копии");
}
/******************************************************************************/void operator =(const A &a) {
Print("class A: Оператор присваивания");
}
};
/******************************************************************************/void assign(A &l, A &r) {
Print("Функция assign()");
l = r;
}
/******************************************************************************/voidOnStart() {
Print("OnStart(): Создаём по умолчанию");
A a;
Print("OnStart(): Получаем \"адрес\" первого объекта");
A *p = GetPointer(a);
Print("OnStart(): Создаём копию, прямо инициализируя предыдущим объектом");
A b(a);
Print("OnStart(): Выполняем присваивание, используя предыдущий объект");
b = a;
Print("OnStart(): Создаём копию, прямо инициализируя так называемым \"указателем\" на предыдущий объект");
A c(p);
Print("OnStart(): Выполняем присваивание, используя так называемый \"указатель\" на предыдущий объект");
b = p;
Print("OnStart(): Выполняем присваивание так называемому \"указателю\" значения его же самого");
p = p;
// *p = *p; Ошибка: '*' - unexpected token, то есть, присвоить объекту другой объект, если есть "адреса" обоих объектов, не так-то просто...Print("OnStart(): Выполняем присваивание объекту по \"адресу\" значения его же самого с помощью вспомогательной функции");
assign(p, p);
}
プログラムは正常にコンパイルされ、実行されます。
22:23:46 Script 3 EURUSDm,H1: loaded successfully
22:23:463 EURUSDm,H1: initialized
22:23:463 EURUSDm,H1: OnStart(): Создаём по умолчанию
22:23:463 EURUSDm,H1: class A: Конструктор по умолчанию
22:23:463 EURUSDm,H1: OnStart(): Получаем "адрес" первого объекта
22:23:463 EURUSDm,H1: OnStart(): Создаём копию, прямо инициализируя предыдущим объектом
22:23:463 EURUSDm,H1: class A: Конструктор копии
22:23:463 EURUSDm,H1: OnStart(): Выполняем присваивание, используя предыдущий объект
22:23:463 EURUSDm,H1: class A: Оператор присваивания
22:23:463 EURUSDm,H1: OnStart(): Создаём копию, прямо инициализируя так называемым "указателем" на предыдущий объект
22:23:463 EURUSDm,H1: class A: Конструктор копии
22:23:463 EURUSDm,H1: OnStart(): Выполняем присваивание, используя так называемый "указатель" на предыдущий объект
22:23:463 EURUSDm,H1: class A: Оператор присваивания
22:23:463 EURUSDm,H1: OnStart(): Выполняем присваивание так называемому "указателю" значения его же самого
22:23:463 EURUSDm,H1: OnStart(): Выполняем присваивание объекту по "адресу" значения его же самого с помощью вспомогательной функции
22:23:463 EURUSDm,H1: Функция assign()
22:23:463 EURUSDm,H1: class A: Оператор присваивания
22:23:463 EURUSDm,H1: uninit reason 022:23:46 Script 3 EURUSDm,H1: removed
はい、ご指摘ありがとうございます。おっしゃるとおり、このバリアントでもシングルトンではありません。
暗黙のコンストラクタと演算子について - 明示的にして使ってみると、オブジェクトへのポインタをデリファレンスできないので、うまくいかないと思います。
MQL4+では、いわゆる「ポインタ」は暗黙的にデリファレンスされるようです。
プログラムは正常にコンパイルされ、実行されます。
この言語ではデリファレンスは定義されていませんが、ポインタから参照への標準的な変換が定義されており、その際に暗黙のデリファレンスが発生するような感じです。assign()関数が利用するのは、この特殊性である。参照は関数のパラメータでしか指定できないようなので、関数がないと無理ですね...。
ALXIMIKS
なぜうまくいかないのか、'ptr' - protected member function を呼び出すことができない :