암시적 생성자 및 연산자에 대해 - 명시적으로 만들고 사용하려고 하면 개체에 대한 포인터의 이름을 변경하는 것이 불가능하기 때문에 작동하지 않는 것 같습니다.
MQL4++에서 소위 "포인터"는 암시적으로 역참조되는 것 같습니다.
#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
역참조가 언어에 정의되어 있지 않은 것처럼 보이지만 포인터에서 참조로의 표준 변환이 정의되어 있으며 그 동안 암시적 역참조가 발생합니다. assign() 함수가 이용하는 것이 바로 이 기능입니다. 참조는 함수 매개변수에서만 설정할 수 있기 때문에 함수 없이는 할 수 없습니다...
알시믹스 :
작동하지 않는 이유, 'ptr' - 보호된 멤버 함수를 호출할 수 없습니다.:
class smart_ptr{
Singleton* ptr;
public :
smart_ptr(Singleton* val): ptr(val){}
smart_ptr(): ptr( NULL ){}
~smart_ptr(){ delete ptr;}
};
네, 관심을 가져주셔서 감사합니다. 맞습니다. 이 버전에서는 싱글톤도 아닙니다.
암시적 생성자 및 연산자에 대해 - 명시적으로 만들고 사용하려고 하면 개체에 대한 포인터의 이름을 변경하는 것이 불가능하기 때문에 작동하지 않는 것 같습니다.
MQL4++에서 소위 "포인터"는 암시적으로 역참조되는 것 같습니다.
프로그램이 성공적으로 컴파일되고 실행됩니다.
역참조가 언어에 정의되어 있지 않은 것처럼 보이지만 포인터에서 참조로의 표준 변환이 정의되어 있으며 그 동안 암시적 역참조가 발생합니다. assign() 함수가 이용하는 것이 바로 이 기능입니다. 참조는 함수 매개변수에서만 설정할 수 있기 때문에 함수 없이는 할 수 없습니다...
알시믹스 :
작동하지 않는 이유, 'ptr' - 보호된 멤버 함수를 호출할 수 없습니다. :