記事"グラフィカルインタフェースXI:標準グラフィックライブラリの統合(ビルド16)"についてのディスカッション - ページ 8

 
Oleksii Chepurnyi:

ElementBase.mqhファイルを変更しようとしたら、さらに叱られた。

 
Pavel Kolchin:

ElementBase.mqhファイルを変更しようとしたら、さらに叱られた。

ElementBase.mqhとElement.mqhの両方を変更する必要があります。

 
MetaQuotes Software Corp.:

最近のビルドでは、先祖のメソッドが 子孫のメソッドでオーバーロードされて いる場合のために、コンパイラにメッセージを追加しました:

この例では、祖先クラス SFoo の func(int) 関数が子孫クラス SBar で呼び出されています。 子クラスには func(double) 関数しかなく、コンパイラは適切なパラメータを持つ関数を継承ツリーから探そうとします。

つまり、MQL5コンパイラは子孫のメソッドをオーバーライドする代わりにオーバーロードを実行するのです。言語開発の初期段階では、MQL5コンパイラのこの緩和は重要視されていませんでした。しかし将来的に変更される可能性があるため、現在ではMQL5プログラムの開発者に対し、コードを考慮し修正するよう明確な警告が出されている。

厳密に言えば、オーバーライドはもう少し広い概念です。オーバーロードとオーバーライドの違いについては、インターネット

1.そのようなコードはコンパイルされないということでよろしいでしょうか?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); }; }; // この行がないとコンパイルできない。
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}
'CA::func' - cannot access private member function      TestCompiler.mq5        27      18
   see declaration of 'CA::func'        TestCompiler.mq5        13      8
1 error(s), 0 warning(s)                2       1


2.このコードは、上記のエラーに加えて、「非推奨の動作、hiddenメソッド呼び出しは将来のMQLコンパイラー・バージョンで無効になります」という警告を 生成するということでよろしいでしょうか? TestCompiler.mq5 27 18。

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); }; }; // この行がないとコンパイルできない。
                bool func( int a ) { return(true); };
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}

 
Andrey Khatimlianskii:

1.そのようなコードはコンパイルされないということでよろしいでしょうか?


2.このコードは、上記のエラーに加えて、「非推奨の動作、非表示メソッド呼び出しは将来のMQLコンパイラー・バージョンで無効になります」という警告を 発生させますが、正しいですか? TestCompiler.mq5 27 18。


ターミナルの新バージョンに関するスレッドで質問したほうがいいのでは?そちらの方が早く答えてくれると思います。)

警告はコンパイラの新しいロジックに適合しているようですが、プライベート・メンバーについては理解できません。

 
Oleksii Chepurnyi:

ElementBase.mqhとElement.mqhの両方を変更する必要がある。

ElementBase.mqhでは、"Is "を "Set "に置き換えたことは明らかだ(しかし、なぜそんなことができるのかは不明だ)。

virtual void      Set Available(const bool state)                  { m_is_available=state;                 }
bool              IsAvailable(void)                         const { return(m_is_available);               }

しかし、Element.mqhには別の行があります。

//--- 商品の在庫状況
virtual void      IsAvailable(const bool state);
 
Pavel Kolchin:

ElementBase.mqhでは、あなたが "Is "を "Set "に置き換えたことは明らかだ(しかし、なぜそうすることができるのかは不明だ)。

しかし、Element.mqhには別の行があります。

今、MQは同じ名前(変数、メソッドなど)を好みません。)

メソッドの名前を変えただけです。

私たちは何も変えたくありません - 作者がすべてをやり直すのを待ちます ) )

 
Oleksii Chepurnyi:

作者はおそらくこのプロジェクトを"終えて "いるのだろうが、コンパイラが悪態をつかないように、どの行に何を書けばいいのか、そしてもちろん、人々のためにオーソドックスな(修正された)ファイル(ElementBase.mqhとElement.mqh)を指定してくれるだろうか?

 

1.今、別のプロジェクトの 真っ最中なんだ。

2.ライブラリを大幅に変更した )

まあ、ElementBase.mqhとElement.mqhの 変更以外に、すべてのエレメントを調べてみてください、もしかしたらそこにもこれらのメソッドがあるかもしれません。

 
Oleksii Chepurnyi:

ターミナルの新バージョンに関するスレッドで質問した方がいいのでは?そっちの方が早く答えてくれると思う)

警告はコンパイラの新しいロジックに適合しているようですが、プライベートメンバーについては理解できません。

そこで回避策を見つけました:

取引、自動取引システム、取引戦略のテストに関するフォーラム

MetaTrader 4ビルド1170の新バージョン

fxsaber, 2019.09.06 09:39 pm.

MT5で提案されているオプションはMT4にも追加されるべき革新的なものだと思います。

しかし、昔ながらの方法でコードを書けば、どこでも機能します。

     void           Test(const bool test){((A)b).Test(test);}

これが私の例の動作です:

CC(void) { ((CA)m_b).func(); }


しかし、これはもちろん解決策ではありません。

 

イリヤス、CAに転向しない選択肢はないのか?