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(constdatetime 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 |//+------------------------------------------------------------------+voidOnStart()
{
// 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_timePrint("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
}
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!
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 должен быть константым.
}
voidOnStart()
{
A a; //не const A
f(GetPointer(a));
}
Und nun die Frage der Aufmerksamkeit: Lassen Sie uns das CO-Objekt wischen.Compare():
virtualint 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!!!
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
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.
Bitte veröffentlichen Sie Ihren gesamten Code.
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:
Mit welcher Begründung haben sie die Umwandlung von nicht konstanten Objekten in konstante aufgehoben?
Alles wird normal kompiliert - keine Fehler oder Warnungen
Wenn es irgendwelche Fehler gibt, dann nur in der Struktur, aber die werden mit der Zeit behoben.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.
Und nun die Frage der Aufmerksamkeit: Lassen Sie uns das CO-Objekt wischen.Compare():
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!!!Die Platzierung statischer Mitglieder ist nun obligatorisch.
Und wie soll man komplexe statische Objekte platzieren, wenn statische Konstruktoren nicht erlaubt sind?
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
anstelle von
void f(A* a)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.
Und wie soll man komplexe statische Objekte platzieren, wenn statische Konstruktoren nicht erlaubt sind?