错误、漏洞、问题 - 页 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;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
 
在什么基础上废除了将非恒定物体 转换为恒定物体的做法?我有数以百计的内部方法停止工作,只是因为它们不是常量,而且现在visiels不能用于常量对象。我的数百个函数都与常量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。比较()。

virtual int  Compare(
   CObject const *  node,       // элемент 
   int            mode=0      // вариант 
   ) const
O.k.这是一个常数方法,需要一个常数对象节点。这是他的权利,宣布节点是不变的。但是,在什么基础上,比较现在应该只用恒定的节点方法来工作?节点没有义务为了比较而拥有恒定的方法。但事实证明,仅仅因为该对象是复杂的,并且没有常量方法,现在他就不能使用标准库和它所意味着的一切!!。

 
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;