Ошибки, баги, вопросы - страница 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:

Помогите установить META TRADER 4 НА OS MAVERICKS, СКАЧАЛА ВСЕ ПРОГРАММЫ,PLAY ON MAC^ВСЕ НОВОЕ, А ВЫДАЕТ ОШИБКУ.КАТАСТРОФА КАКАЯ -ТО

/*модератор: прилжоите текст ошибки файлом*/

 
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 не должен следить за static

Кроме того это мнимая защита, поскольку static модифицируется обычной функцией 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 не должен следить за static

Кроме того это мнимая защита, поскольку static модифицируется обычной функцией h() и A::f() const об этом даже не узнает

Спасибо за сообщение, исправлено.
 

Ошибка компиляции 358 во всех случаях вызова h( A* a)

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, но тут вероятна иная причина, поскольку на возникновение ошибки влияет наличие const в объявлении void f() const, а там не было функций-членов 

 

В build 976 не компилируется (ошибка 358, но отличается от ранее описанных ранее тем, что в build 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 была исправлена ошибка связанная с тем, что обычная функция, вызванная из const метода класса могла модифицировать члены класса переданные ей по не const& ссылке. Но здесь членом класса является указатель, и его значение гарантированно не будет изменено при вызове h( A* a), а может быть лишь изменено при объявлении h( A* &a )
 
A100:

В build 976 не компилируется (ошибка 358, но отличается от ранее описанных ранее тем, что в build 975 ошибок не возникало)   

Возможно связано с тем, что в build 976 была исправлена ошибка связанная с тем, что обычная функция, вызванная из const метода класса могла модифицировать члены класса переданные ей по не const& ссылке. Но здесь членом класса является указатель, и его значение гарантированно не будет изменено при вызове h( A* a), а может быть лишь изменено при объявлении h( A* &a )
Спасибо за сообщение, исправлено.