mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 9

 
Ilya Malev:

スタックオーバーフロー」と表示されました。)

やっぱりゴキブリかなぁ...。

まあ、コンパイラではなく、実行時に コンパイラが反応するはずなんですけどね。

以下は、VS 2010で試した内容です。

class A
 {
  public:
   virtual int f2() = 0;
 };

class B : public A
{
 public:
  virtual int f2() { return A::f2(); }
};

B b;

コンパイルエラーが 発生します。エラー 1 エラー LNK2001: 未解決の外部シンボル "public: virtual __thiscall A::f2(void)" があります。

しかし、Metaeditorは何も言いません。よくないですね。

 
祖先関数を= 0 で呼び出すと、自分自身を呼び出すことになることが判明したのです。もし、このエラーを自分で見つけたら、その恩恵にあずかることができるかもしれません...。
 
Alexey Navoykov:

コンパイラはこのように反応するはずです。

VS 2010で試してみました。

コンパイルエラーが 発生します。エラー 1 エラー LNK2001: 未解決の外部シンボル "public: virtual __thiscall A::f2(void)" があります。

メタエディターは何も言いません。よくないですね。

アレクセイ、説明してくれ、なぜmqlがCのコピーなら、それは必ずしも絶対に同一でなければならず、左へ一歩、右へ一歩 - 銃殺刑?

開発者が不注意だっただけ?しかし、どんな言語もループと条件の上に成り立っている。それ以外はすべてトレーラーに収録されています。なぜ誰も、他の言語がOOPの部分などでCと似ていると要求しないのでしょうか?

 
Alexey Viktorov:

アレクセイ、どうしてmqlがCと同じなら、絶対に同じで一歩左、一歩右の銃殺刑にしなければならないのか、指で説明してくれないかな?

開発者が不注意だっただけ?しかし、どんな言語もループと条件の上に成り立っている。それ以外はすべてトレーラーに収録されています。なぜ誰も、他の言語がOOPの部分などでCと似ていると要求しないのでしょうか?

完全に同じであることが重要なのではありません。しかし、その前に、「他の言語ではどうなんだ?そして、異なる(正しい)動作をするC++が例として出されると、MQLはC++ではないので同一視すべきではないと、古いわだかまりを持ち始める。 あなたは決心する必要があります。
 
Alexey Viktorov:

コードを書きやすくしたり、短くしたり、少なくともエラーから守ったりするための例を示してもらえますか?そして、抽象的な機能ではなく、Expert Advisorやインジケータで実際の取引条件に近い機能をお願いします。

まさかね。男たちは、妄想を現実のものにしようとしているだけだ。

 
Dmitry Fedoseev:

まさかね。男たちは、妄想を現実に引き伸ばそうとしているだけなのだ。

これはとても有効な手段だと思います。ファンタジーを現実に引き延ばすのですから。そこが開発のポイントです
とても勉強になる議論でした。(笑): ありがとうございます。
 
Alexey Navoykov:

そうですね。でも、私はずっと別の選択肢を使っています。すべてのインターフェースは、もともと中間テンプレートクラスとして設計されています。

このように、このようなインタフェースをいくつも組み合わせて、継承の連鎖を作ることができます。もちろん、dynamic_castはできませんが、それほど頻繁に必要なわけではありません。 主な作業は、関数にそれらを渡すことです。

じっくり読ませていただきました!それにしても面白い動きですね。今まで思いつかなかった =)。私も気ままに実験してみます...。

 
Nikolai Semko:
私にとって、ファンタジーを現実に引き伸ばすということは、とても有効なエクササイズです。そこが開発のポイントです
非常に勉強になる議論です。ありがとうございます。

そして何より、実りあるものでした!開発者は私たちの声に耳を傾け、誰もが何年もつまずき続けてきたこのバグを修正することにしたのです。

しかし、一部の掲示板利用者の破壊的な態度には、確かに驚かされます。彼らは、自分では発展せず、驚くべき執念で他人の邪魔をしようとするのです。

 

>> もちろん、これで dynamic_cast をすることはできませんが、それほど頻繁に必要なわけではありません。

なんでやらないんだ、問題ないだろ )しかし、コンパイル時にキャスティングエラーが検出されないという悪夢が待っています。)

 
Ilya Malev:

>> もちろん、これで dynamic_cast をすることはできませんが、それほど頻繁に必要なわけではありません。

なんでやらないんだ、問題ないだろ )しかし、コンパイル時にキャスティングエラーが検出されないという悪夢が待っています :)

結局のところ、継承の連鎖はどうにでもなります。Interface<CBase>かInterface<C<B<A<CBase>>か、無数のバリエーションがあります。 CBaseをすべての可能なバリエーションに一貫してキャストしなければなりませんが、これは非現実的なことです。

インターフェイスの情報をクラスオブジェクトに 格納し、既存のインターフェイスパッドに加えて、独立したインターフェイスクラスを作成し、そのパッドのラッパーとして機能させることを計画していたのを覚えています。でも、そんなことは余計なお世話だと思うようになったんです。実際のところ、ベースクラスをどのインターフェイスにキャストする必要があるのか見たことがありません。 唯一の選択肢は、デバッグのためにクラスがこのインターフェイスをサポートしているかどうかを調べることですが、そのためにキャストをする必要はありません。