Fehler, Irrtümer, Fragen - Seite 1135

 
Fleder:
Bitte veröffentlichen Sie Ihren gesamten Code.
Dies ist ein Beispiel aus der mql5-Dokumentation. Hier ist der Link zu dieser Seite. Und unten ist dieser Code.
//+------------------------------------------------------------------+
//| Класс с конструктором по умолчанию                               |
//+------------------------------------------------------------------+
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:
Dies ist ein Beispiel aus der mql5-Dokumentation. Hier ist ein Link zu dieser Seite. Und unten ist dieser Code.

Es scheint, dass mit der Aktualisierung nicht nur die obligatorischePlatzierung von statischen Klassendatenmitgliedern eingeführt wurde,

aber auch den impliziten Aufruf des parametrischen Konstruktors entfernt.

Verwenden Sie einen expliziten Aufruf:

   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3(D'2009.09.09');     // явный вызов параметрического конструктора
   CFoo foo4(foo1);              // явный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
 
Auf welcher Grundlage wurde die Umwandlung von nicht konstanten Objekten in konstante Objekte abgeschafft? Ich habe Hunderte von internen Methoden, die nicht mehr funktionieren, nur weil sie nicht konstant sind, und die visiels können jetzt nicht in konstanten Objekten verwendet werden. Hunderte meiner Funktionen sind an die Konstante CObject.Compare(...) gebunden und jetzt funktionieren sie alle nicht mehr!
 
Das OOP in mql5 scheint spezifische Änderungen erfahren zu haben. Heimlich, heimlich...
 
C-4:
Mit welcher Begründung haben sie die Umwandlung von nicht konstanten Objekten in konstante aufgehoben?

Alles wird normal kompiliert - keine Fehler oder Warnungen

class A {};
void f( const A& a ) {}
void OnStart()
{
        A a; //не const A
        f( a );
}
Wenn es irgendwelche Fehler gibt, dann nur in der Struktur, aber die werden mit der Zeit behoben.
 
A100:

Alles kompiliert ohne Fehler oder Warnungen

Wenn "A" eine nicht-konstante Methode enthält, aber selbst als konstantes Objekt an eine Funktion übergeben wird, dann kann diese nicht-konstante Methode in der Funktion nicht mehr aufgerufen werden.

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));
}

Und nun die Frage der Aufmerksamkeit: Lassen Sie uns das CO-Objekt wischen.Compare():

virtual int  Compare(
   CObject const *  node,       // элемент 
   int            mode=0      // вариант 
   ) const
O.k., es ist eine konstante Methode, die einen konstanten Objektknoten nimmt. Es ist sein Recht, Knoten als konstant zu deklarieren. Aber auf welcher Grundlage sollte Compare jetzt nur noch mit konstanten Methoden von Knoten arbeiten? Node ist nicht verpflichtet, konstante Methoden zu haben, um zu vergleichen. Aber es stellt sich heraus, dass er, nur weil das Objekt komplex ist und keine konstanten Methoden hat, jetzt nicht die Standardbibliothek mit allem, was dazu gehört, verwenden kann!!!

 
mql5:
Die Platzierung statischer Mitglieder ist nun obligatorisch.

Und wie soll man komplexe statische Objekte platzieren, wenn statische Konstruktoren nicht erlaubt sind?

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

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

Wenn "A" eine nicht konstante Methode enthält, aber selbst als konstantes Objekt an die Funktion übergeben wird, kann diese nicht konstante Methode nun nicht in der Funktion aufgerufen werden.

Das ist richtig, so sollte es sein, denn wozu sonst die Angabe

void f(const A* a)

anstelle von

void f(A* a)
 
C-4:

Wenn "A" eine nicht konstante Methode enthält, aber selbst als konstantes Objekt an die Funktion übergeben wird, kann diese nicht konstante Methode nun nicht in der Funktion aufgerufen werden.

Ähm, das ist eigentlich die schicke Art, es zu tun.
 
C-4:

Und wie soll man komplexe statische Objekte platzieren, wenn statische Konstruktoren nicht erlaubt sind?

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

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

A* B::a = new A;