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

 
Fleder:
すべてのコードを掲載してください。
これは、mql5のドキュメントにある例です。そのページへのリンクは こちらです。そして、以下がこのコードです。
//+------------------------------------------------------------------+
//| Класс с конструктором по умолчанию                               |
//+------------------------------------------------------------------+
class CFoo
  {
   datetime          m_call_time;     // время последнего обращения к объекту
public:
   //--- конструктор с параметром, имеющем значение по умолчанию, не является конструктором по умолчанию
                     CFoo(const datetime t=0){m_call_time=t;};
   //--- конструктор копирования 
                     CFoo(const CFoo &foo){m_call_time=foo.m_call_time;};
 
   string ToString(){return(TimeToString(m_call_time,TIME_DATE|TIME_SECONDS));};
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// CFoo foo; // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- допустимые варианты создания объекта CFoo
   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3=D'2009.09.09';      // неявный вызов параметрического конструктора
   CFoo foo40(foo1);             // явный вызов конструктора копирования
   CFoo foo41=foo1;              // неявный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
//--- допустимые варианты получения указателей CFoo
   CFoo *pfoo6=new CFoo();       // динамическое создание объекта и получение указателя на него
   CFoo *pfoo7=new CFoo(TimeCurrent());// ещё один вариант динамического создания объекта
   CFoo *pfoo8=GetPointer(foo1); // теперь pfoo8 указывает на объект foo1
   CFoo *pfoo9=pfoo7;            // pfoo9 и pfoo7 указывают на один и тот же объект
   // CFoo foo_array[3];         // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- выведем значения m_call_time
   Print("foo1.m_call_time=",foo1.ToString());
   Print("foo2.m_call_time=",foo2.ToString());
   Print("foo3.m_call_time=",foo3.ToString());
   Print("foo4.m_call_time=",foo4.ToString());
   Print("foo5.m_call_time=",foo5.ToString());
   Print("pfoo6.m_call_time=",pfoo6.ToString());
   Print("pfoo7.m_call_time=",pfoo7.ToString());
   Print("pfoo8.m_call_time=",pfoo8.ToString());
   Print("pfoo9.m_call_time=",pfoo9.ToString());
//--- удалим динамически созданные объекты
   delete pfoo6;
   delete pfoo7;
   //delete pfoo8;  // удалять pfoo8 явно не нужно, так как он указывает на автоматически созданный объект foo1
   //delete pfoo9;  // удалять pfoo9 явно не нужно, так как он указывает на тот же объект, что и pfoo7
  }
 
Tron_KZ:
これは、mql5のドキュメントにある例です。そのページへのリンクは こちらです。そして、以下がこのコードです。

今回の更新で、静的なクラスデータメンバの強制配置だけ でなく、静的なクラスデータメンバが導入されたようです。

が、パラメトリックコンストラクタの暗黙の呼び出しも削除されました。

明示的な呼び出しを使用する。

   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3(D'2009.09.09');     // явный вызов параметрического конструктора
   CFoo foo4(foo1);              // явный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
 
非定数の ものを定数に変換することは、どのような根拠で廃止されたのですか?定数でないというだけで、動かなくなる内部メソッドが何百とありますし、ビジュアルも今は定数オブジェクトでは使えませんしね。何百もの私の関数が定数CObject.Compare(...)に結びつけられていて、今、それらはすべて動作しないのです。
 
mql5のOOPは、具体的な変更が加えられているようです。こっそり...
 
C-4:
どのような理由で、非定数の ものを定数に変換することを取りやめたのでしょうか。

エラーや警告はなく、すべて正常にコンパイルされます。

class A {};
void f( const A& a ) {}
void OnStart()
{
        A a; //не const A
        f( a );
}
もしエラーがあっても、それは構造上のものだけで、いずれは手に入るだろう
 
A100:

エラーや警告を出さずにすべてコンパイルできる

A "に定数でないメソッドが含まれていても、それ自体が定数オブジェクトとして 関数に渡される場合、関数内でこの定数でないメソッドを呼び出すことは不可能になりました。

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

void f(const A* a)
{
   a.PrintMyName(); //Хренушки. Теперь PrintMyName должен быть константым.
} 

void OnStart()
{
        A a; //не const A
        f(GetPointer(a));
}

そして、今注目の問題:CObjectを拭いてみましょう。Compare()です。

virtual int  Compare(
   CObject const *  node,       // элемент 
   int            mode=0      // вариант 
   ) const
O.k.これは、一定のオブジェクト・ノードを取る一定のメソッドです。ノードを不変と宣言するのは、彼の権利です。しかし、どのような根拠があって、コンペアは今、ノードの定数メソッドでしか動作しないのでしょうか?NodeはCompareのために定数メソッドを持つことを義務づけられているわけではありません。しかし、そのオブジェクトが複雑で定数メソッドを持っていないという理由だけで、標準ライブラリが意味するものをすべて使うことができないことが判明したのです!

 
mql5:
静的メンバーの配置が義務化されました。

また、静的コンストラクタが許されない場合、複雑な静的オブジェクトをどのように配置することになるのでしょうか?

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

class B
{
   public:
      static A* a; //В этом месте как прикажете объект инициализировать? 
};
 
C-4:

A "に定数でないメソッドが含まれていても、それ自体が定数オブジェクトとして 関数に渡される場合、この定数でないメソッドは現在関数内で呼び出すことができません。

そうだ、そうでなければ、何を指定する意味がない。

void f(const A* a)

代わりに

void f(A* a)
 
C-4:

A "に定数でないメソッドが含まれていても、それ自体が定数オブジェクトとして 関数に渡される場合、この定数でないメソッドは現在関数内で呼び出すことができません。

ええと、実はこれが洒落たやり方なんです。
 
C-4:

また、静的コンストラクタが許されない場合、複雑な静的オブジェクトをどのように配置することになるのでしょうか?

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

class B
{
   public:
      static A* a;
};

A* B::a = new A;