错误、漏洞、问题 - 页 1201

 

虚拟函数 操作中的一个错误

class A { public:
        virtual void f() { Print( __FUNCTION__ ); }
};
class B : public A { public:
        virtual void f() { Print( __FUNCTION__ ); }
};

class H { public:
        H( A* a ) { H::s[ 0 ] = a; }
        static void g();
        static A* s[ 1 ];
};
A *H::s[ 1 ] = { 0 };
void H::g() { H::s[ 0 ].f(); } //еще обратил внимание, что в этом месте редактор выделяет (.f) зеленым
void OnStart()
{
        A* b = new B();
        H h( b );
        H::g(); //печатает A::f()
        delete( b );
}

结果:A::f(),应该是B::f()

 
如何处理市场上的垃圾邮件?我投诉了,那个垃圾邮件发送者被禁了一天,现在他已经被解禁了,但他的东西还在那里。或者是正常的?产品讨论页不是用于客户反馈的吗?
 
Motoellesse:

帮助在MAVERICKS操作系统上安装META TRADER 4,下载了所有程序,在MAC上播放,都是新的,任何东西都出现了错误。

/*moderator:将错误文本作为文件发送*/。

 
Motoellesse:

2 - 调试前。

3 - 后。

也许那里有差异,我根本不明白什么)

非常感谢您)

附加的文件:
 

编译错误

class A {
public:
        void f() const { a = 1; } //member of the constant object cannot be modified
        static int a;
};
int A::a = 0;

而const不应该遵循静态

另外,这是一个虚假的保护,因为静态被通常的h()函数修改,而A::f()const甚至不会知道。

class A {
public:
        void f() const { h(); } //все равно поменяли значение (а)
        static int a;
};
int A::a = 0;

void h()
{
        A::a = 1;
}
 
A100:

虚拟函数的 操作中出现错误

结果:A::f(),应该是B::f()

谢谢你的帖子,修好了。
 
A100:

编译错误

而const不应该遵循静态

另外,这是一个虚假的保护,因为静态被通常的h()函数修改,而A::f()const甚至不会知道。

谢谢你的帖子,修好了。
 

在所有调用h( A* a)的情况下都会出现编译错误358

class A {
};

class B {
public:
	B() : a1( NULL ), a2( NULL ), a3( NULL ), a4( NULL ) {}
        void f() const {
                h( a1 ); // не обоснована (1)
                h( a2 ); // не обоснована (2)
                h( a3 ); //    обоснована (3)
                h( a4 ); //    обоснована (4)
        }
              A *       a1;
              A * const a2;
        const A *       a3;
        const A * const a4;
};

void h( A* a )
{
}

它只在(3)和(4)中是合理的,因为它不是h( const A* a)

类似的情况在早些时候得到了纠正https://www.mql5.com/ru/forum/1111/page1218#comment_1058402,但原因可能不同,因为在void f() const声明中存在const会影响错误的发生,而且没有成员函数

 

在构建976中无法编译(错误358,但与之前描述的构建975中的错误不同)。

class A {};
struct S { int s; };

void h1( A* a ) {}
void h2(       S& s ) {}
void h3( const S& s ) {}

class B {
public:
        void    f1() const { h1( this.a ); } //не обоснованная и возникла только в build 976
//      void    f2() const { h2( this.s ); } //   обоснованная ошибка в build 976
        void    f3() const { h3( this.s ); } //нормально
        A* a;
        S  s;
};
原因可能是Build 976修复了与以下事实有关的错误:从一个 常态类方法 调用的普通函数可以修改由非常态&引用传递给它的类成员。但是这里的指针是一个类成员,它的值在调用h( A* a )时保证不会被改变,而只能在声明h( A* &a )时被改变。
 
A100:

在构建976中不编译(错误358,但与之前描述的不同,在构建975中没有发生错误)。

原因可能是Build 976修复了与以下事实有关的错误:从一个 常态类方法 调用的普通函数可以修改由非常态&引用传递给它的类成员。但是这里的指针是一个类成员,它的值在调用h( A* a )时保证不会被改变,而只有在声明h( A* &a )时才能被改变。
谢谢你的帖子,修好了。