エラー、バグ、質問 - ページ 1696

 
Stanislav Korotky:

まず、メソッドをvirtualとして宣言しようとしたのか、そうでないのかが不明です。もしvirtualでなければならないのであれば、派生クラスではなくベースクラスにvirtualと書いてください(そうしないと、派生クラスのインスタンスを入れてもベースメソッドへのポインタがリッピングされてしまうからです)。

派生クラスでメソッドをオーバーライドしたくない場合は、一切言及せず、オーバーライドする場合は、ボディを付けてオーバーライドする必要があります。

最後に、派生クラスからメソッドを隠すには、中間クラスを導入し、そこでメソッドをプライベートに移動させるか、ベースクラスでプライベート化する必要があります(でも、それならなぜバーチャルなのか?)

以下はその一例です。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class roditel
  {
public:

   virtual int one(void)
     {
      return 1;
     }
   virtual int two(void)
     {
      return 2;
     }
   virtual int three(void)
     {
      return 3;
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class naslednic_1 : public roditel
  {
public:
   virtual int       two(void);
   virtual int       three(void);
  };

naslednic_1 go;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   go.two();
// 'two' - function must have a body    TEst.mq4        42      7
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak:

以下はその一例です。

この例は、最初の例とほぼ同じです ;-)。私の手紙を開いたのに、読んでいないのですか?メソッドを定義せず、子孫で新たに宣言することで、何を実現したいのでしょうか?新しいものを持たずに基本的な実装を呼び出すには、子孫でそれらに言及する必要はありません。
 
Stanislav Korotky:
この例は、最初の例とほぼ同じです ;-)。私の手紙は開封されましたが、読まれなかったのですか?メソッドを定義せず、子孫で再宣言することで何を実現したいのでしょうか?新しい実装を持たずに基本的な実装を呼び出すには、子孫で宣言する必要はない。

私は、10個の継承されたメソッドと 子孫クラスで作成されたメソッドのみを表示したいのです。 私は、現在のクラスと何ら関係のない190個のメソッドは必要ありません。

例えば、幅、高さ、角、半径、色、面積など、形状の最大限のプロパティを記述したベースクラスがあります。

これらのプロパティメソッドを元に、親クラスのメソッド、半径、色、面積...を使用する円の派生クラスを作成します。でも、ここでは角や幅は必要ないんです.

これらのメソッドに基づいて、親クラスのメソッド、色、面積、角...を使用する子孫の三角形クラスを作成します。でも、ここに半径は必要ない・・・。

なぜかというと、親クラスにはcolor, styleメソッドのように、すべてに共通するメソッドや図形群に共通するメソッド群があるのです。

 
Vladimir Pastushak:

私は、10個の継承されたメソッドと 子孫クラスで作成されたメソッドのみを表示したいのです。 私は、現在のクラスと何ら関係のない190個のメソッドは必要ありません。

例えば、幅、高さ、角、半径、色、面積など、形状の最大限のプロパティを記述したベースクラスがあります。

これらのプロパティメソッドを元に、親クラスのメソッド、radius、color、area...を使用する子孫クラスを作成する。でも、ここでは角や幅は必要ないんです.

これらのメソッドに基づいて、親クラスのメソッド、色、面積、角...を使用する子孫の三角形クラスを作成します。でも、ここに半径は必要ない・・・。

理由を聞いてみると、親クラスは、例えばメソッドカラーやスタイルなど、すべてに共通するメソッド群や、図形群に共通するメソッド群を持っているのです。

私は理解できません:この質問 - 質問または下書きされた答え?通常はそうして、ベースクラスでは共通、子孫では特殊を追加していくのです。なぜ、その逆をするのか?目的は何ですか?

しかし、これ以上深入りしないにしても、私はすでに、不要なプロパティやメソッドをすべてプライベート部分に移動させた中間的な子孫を挿入するという選択肢を提案しているのです。

 
事務局への質問ですが、サービスの新しい最新統計はいつ見ることができるのでしょうか?
 
Vladimir Pastushak:

親クラスには200のメソッドがあり、私は10個の継承されたメソッドと 子クラスで作成されたメソッドだけを表示したいのですが、現在のクラスと関係のない190個のメソッドは必要ありません。

そのためには、protectedまたはprivateとして継承を宣言し、必要なメソッドをオーバーライドする必要があります。

class naslednic_1 : protected roditel
  {
public:
   virtual int       two(void)   { return roditel::two(); }
   virtual int       three(void) { return roditel::three(); }
  };
 
Alexey Navoykov:

そのためには、protectedまたはprivateとして継承を宣言し、必要なメソッドをオーバーライドする必要があります。

スタニスラフ・コロツキー

よくわからないのですが、この質問は質問なのでしょうか、それとも不完全な答えなのでしょうか?通常は、ベースとなるクラスで一般的なものを作り、その子孫で特殊なものを追加していく、というやり方です。なぜ、その逆をやるのか?目的は何ですか?

しかし、あまり深く考えずとも、中間の子孫を挿入して、不要なプロパティやメソッドをすべてプライベートな部分に移動させるという選択肢も既に提案した。

ありがとうございます。

Alexey、あなたの例はうまくいきません、いずれにせよ、子は親のメソッドを取得します、それはダンプされるべきではないでしょう。


 
自分のINDICATOR_SHORTNAMEを 知るにはどうしたらよいですか?IndicatorGet*-functionsがない!
 
Alexey Kozitsyn:
作成時にショートネームを変更した場合はどうなりますか?

そして、毎回変える?

インジケーターにインジケーターバッファが 含まれていれば自己識別は容易ですが、バッファがない場合はまだ解決策が見えてきません。

 
fxsaber:
自分のINDICATOR_SHORTNAMEを 知るにはどうしたらよいですか?IndicatorGet*関数が存在しない!
Print(MQLInfoString(MQL_PROGRAM_NAME));インジケーターのショートネームを 返します。短縮名を指定しない場合、フルネームが返される。