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
我做得太简单了--我没有移动const--正如你现在看到的,一切都很清楚--一个常数被另一个常数初始化了。
编译器显示s1成员是受保护的,这是一个错误。 如果我们用public代替protected,一切都会像时钟一样工作。但被保护与初始化顺序或赋值顺序无关,也与以特定值初始化的可能性无关
我必须阅读这方面的标准。
我同意,在一般情况下,编译器不一样,你必须把它整理出来。
下面是另一个例子
这里的MQL编译器不想用常量的int值来初始化数组(enum - passes)。
我再次呼吁,C++复制它并正确初始化的事实。
可能是调用序列中的一个错误
在C++中,对表达式的操作数进行评估的顺序是UB。你为什么要在这里依赖一个特定的顺序?
被输出为 "word Hello"?
在这种情况下,对于int类型 的重载运算符会发生这种情况,而对于字符串类型,一切都会正常输出。
此外,它与C++毫无关系。假设你在你的代码中写道
而你让这些函数以相反的顺序执行,或者对不同类型的参数根本不执行--以任意的顺序执行问候!
帮助我修复 "无效的指针访问"。
在OnInit()中,我们有。
SymbolsCollection = new CSymbolsCollection(); SymbolsCollection.RefreshRealSymbols();CSymbolsCollection::RefreshRealSymbols() 方法有一个CleanSymbolsArray(myRealSymbols) 调用。
这些方法和变量在类中被声明为。
问题是,如果在CSymbolsCollection 构造函数中调用RefreshRealSymbols(),会正常执行。
然而,在OnInit()中调用SymbolsCollection.RefreshRealSymbols();会导致。
错误指向CSymbolsCollection::RefreshRealSymbols() 方法正文中的CleanSymbolsArray(myRealSymbols); 行,位置就在开头括号后。
有什么想法吗?
...
有什么想法吗?