너무 많이 구걸했습니다. const를 전송하지 않았습니다. 이제 모든 것이 명확해진 것을 볼 수 있습니다. 하나의 상수가 다른 상수에 의해 초기화됩니다.
class A {
protected : //если заменить на public: то все работает
staticconstint s1;
staticconstint s2;
};
constint A::s1 = 0x1 ;
constint A::s2 = A::s1; //ошибка компиляции
오류로 컴파일러는 s1 구성원의 보안을 가리킵니다. protected를 public으로 바꾸면 모든 것이 시계처럼 작동합니다. 그러나 보안은 본질적으로 초기화 순서, 할당 순서 또는 특정 값으로 초기화하는 기능과 아무 관련이 없습니다.
class A {
public :
A * operator <<( int x ) { Print ( x ); return ( GetPointer ( this )); }
A * operator <<( string s ) { Print ( s ); return ( GetPointer ( this )); }
};
int f( int & x ) { return ( x = 4 ); }
voidOnStart ()
{
Print ( "" );
A a;
int x = 3 ;
a << "(1)" << "(2)" << "(3)" ; // Результат: (1) (2) (3) //нормально
a << x << f( x ) << x; // Результат: 4 4 3 ??? как же так?
}
후자의 경우 이전 결과와 유추하여 3 4 4 결과가 예상되었습니다. 일부 유형에는 하나의 호출 순서가 있고 다른 유형에는 다른 호출 순서가 있는 것이 정상이 아닙니다.
사실, 이것은 쓰여진 내용이 약간 망상적으로 보이기 때문에 논리적입니다.
C++은 그렇게 생각하지 않습니다.
예, C++는 많은 것을 계산하지 않지만 요점은 정적 멤버 가 초기화된 순서가 아니라 선언된 순서대로 초기화될 수 있다는 것입니다.
그것에 대해 표준을 연기 할 필요가 있습니다.
https://www.mql5.com/ru/docs/basis/variables/initialization
너무 많이 구걸했습니다. const를 전송하지 않았습니다. 이제 모든 것이 명확해진 것을 볼 수 있습니다. 하나의 상수가 다른 상수에 의해 초기화됩니다.
오류로 컴파일러는 s1 구성원의 보안을 가리킵니다. protected를 public으로 바꾸면 모든 것이 시계처럼 작동합니다. 그러나 보안은 본질적으로 초기화 순서, 할당 순서 또는 특정 값으로 초기화하는 기능과 아무 관련이 없습니다.
그것에 대해 표준을 연기 할 필요가 있습니다.
일반적인 경우 컴파일러는 컴파일러와 다르며 분류해야 한다는 점에 동의합니다.
다른 예시
여기서 MQL 컴파일러는 const int 값(열거형 - 전달)으로 배열을 초기화 하고 싶지 않습니다.
다시 말하지만, C++가 이것을 복사하고 올바르게 초기화한다는 사실에 호소합니다.
아마도 호출 순서의 오류일 것입니다.
C++에서 표현식의 피연산자가 평가되는 순서는 UB입니다. 왜 여기에서 특정 주문에 의존합니까?
"word Hello"로 출력?
이 경우, 이것은 string 유형의 경우 모든 것이 정상적으로 표시된다는 사실에도 불구하고 int 유형 에 대한 오버로드된 연산자에 대해 발생합니다.
게다가 C++는 그것과 아무 관련이 없습니다. 코드로 작성했다고 가정해 보겠습니다.
그리고 당신을 위해 이러한 함수는 역순으로 실행되거나 일반적으로 다른 유형의 인수에 대해 임의의 순서로 실행되었습니다.인사말!
'잘못된 포인터 액세스' 문제를 해결하는 데 도움이 됩니다.
OnInit()에는 다음이 있습니다.
SymbolsCollection = new CSymbolsCollection(); SymbolsCollection.RefreshRealSymbols();
CSymbolsCollection::RefreshRealSymbols() 메서드에 CleanSymbolsArray(myRealSymbols)에 대한 호출이 있습니다.
이 메서드와 변수는 클래스에서 다음과 같이 선언됩니다.
문제는 RefreshRealSymbols() 가 CSymbolsCollection 생성자에서 호출될 때 제대로 실행된다는 것입니다.
그러나 SymbolsCollection .RefreshRealSymbols(); OnInit()에서; 으로 이끌다:
CSymbolsCollection::RefreshRealSymbols() 메서드 본문에서 CleanSymbolsArray(myRealSymbols); , 위치는 여는 괄호 바로 뒤에 있습니다.
어떤 아이디어?
...
어떤 아이디어?