class A {
protected: //если заменить на public: то все работает
staticconstint s1;
staticconstint s2;
};
constint A::s1 = 0x1;
constint A::s2 = A::s1; //ошибка компиляции
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 ??? как же так?
}
voidOnStart()
{
int a = 0x1;
int b = a << 2 << a; //b = 8int c = (a << 2) << a; //c = 8int d = a << (2 << a); //d = 16Print ( "b=", b, ", c=", c, ", d=", d );
}
実のところ、書かれていることがちょっとした妄想に見えるから、納得がいくのです。
C++はそのように考えていない。
ああ、C++はいろいろ数えられないけど、要は、静的メンバの 初期化は、初期化順じゃなくて、宣言順なんだろうね。
この件に関しては、スタンダードを読む必要がありそうだ。
https://www.mql5.com/ru/docs/basis/variables/initialization
定数が別の定数によって初期化されるのは、もうお分かりですね。
コンパイラはs1メンバがprotectedであることをエラーとして表示します。 protectedをpublicに置き換えると、すべてが規則正しく動作するようになります。しかし、protectedであることは、初期化順や代入順、特定の値で初期化される可能性とは関係がない
これについては、規格を読まないといけないですね。
そうですね、一般的にはコンパイラが違うので、それを整理する必要がありますね。
以下もその一例です。
MQLコンパイラはここで、配列を const int値で初期化 することを望んでいません(enum - pass)。
ここでもC++がコピーして正しく初期化することをアピールしています。
コールシーケンスにエラーが発生した可能性があります
C++では、式のオペランドを評価する順序はUBです。なぜここで特定のオーダーに頼るのですか?
が "word Hello "と出力された?
この場合、int型 ではオーバーロードされた演算子が、string型ではすべて正常に出力されます。
しかも、C++とは何の関係もない。仮にあなたがコードにこう書いたとします。
そして、これらの関数は、異なるタイプの引数に対して、逆順に、または全く順番に実行されます - 。ごあいさつ
無効なポインタへのアクセス」を修正するのを手伝ってください。
OnInit()では、次のようになります。
SymbolsCollection = new CSymbolsCollection(); SymbolsCollection.RefreshRealSymbols();CSymbolsCollection::RefreshRealSymbols() メソッドにCleanSymbolsArray(myRealSymbols) コールを追加しました。
これらのメソッドと変数は、クラス内で次のように宣言されています。
問題は、RefreshRealSymbols()は、CsymbolsCollectionの コンストラクタ内で呼び出すと正常に実行されることである。
しかし、OnInit();の中でSymbolsCollection.RefreshRealSymbols();を呼び出すと、結果的に。
CSymbolsCollection::RefreshRealSymbols() メソッド本体のCleanSymbolsArray(myRealSymbols); の行を指しており、その位置は開き括弧の直後であることがわかります。
何かアイデアはありますか?
...
何かアイデアはありますか?