错误、漏洞、问题 - 页 1982

 
fxsaber:

触发了默认的复制操作符。

如果不难,我在哪里可以读到?

 

你能告诉我如何使用MQL4/5从电子邮件或短信中读取信息吗?例如,我收到信息-信号到电子邮件,我的专家顾问阅读它并开仓/平仓

 
fxsaber:

触发了默认的复制操作符。

我甚至在文档中发现了这一点(注意从底部第三行)。

https://www.mql5.com/ru/docs/basis/types/casting

class CBar { };
class CFoo : public CBar { };
 
void OnStart()
  {
   CBar bar;    
//--- динамическое приведение типа указателя *bar к указателю *foo разрешено 
   CFoo *foo = dynamic_cast<CFoo *>(&bar); // критической ошибки выполнения не возникнет   
   Print(foo);                             // foo=NULL      
//--- попытка явного приведения ссылки объекта типа Bar к объекту типа Foo запрещено
   foo=(CFoo *)&bar;                       // возникнет критическая ошибка выполнения
   Print(foo);                             // эта строка не будет выполнена
  }

我记得有可能复制(以memcpy方式)到简单的结构,但我的结构并不简单。

 
pavlick_:

我记得有可能复制(哑巴memcpy风格)到简单的结构中,但我没有简单的结构

MQL5已经改变。

 
fxsaber:

MQL5已经改变。

关于交易、自动交易系统和测试交易策略的论坛

新版MetaTrader 5 build 1640:创建并测试您自己的金融工具

MetaQuotes软件公司。, 2017.07.19 18:03

新版MetaTrader 5平台build 1640:创建和测试您自己的金融工具

  1. MQL5: 为结构和类的对象 增加了 自动生成隐式复制运算符。现在,编译器自动生成复制操作符,这允许为对象编写简单的记录,如b=a。
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- конструктор по умолчанию
                         Foo(void){value=-1;};
       //--- конструктор с параметрами   
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|  структура, содержащая объекты типа Foo                          |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Результат выполнения;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    隐式运算符用心复制对象。

    • 如果一个成员是一个对象,就会调用这个对象对应的复制操作符。
    • 如果成员是一个对象数组,在为每个元素调用适当的复制操作者之前,接收数组通过ArrayResize被放大或缩小到所需的大小。
    • 如果一个成员是一个简单类型的数组,则使用ArrayCopy函数进行复制。
    • 如果一个成员是一个指向对象的指针,那么复制的是指针本身,而不是它指向的对象。

    如果有必要,你可以覆盖该行为,并使用重载 创建你自己的变体,而不是隐式复制操作符。
 

fxsaber

谢谢你,现在明白了。不知道该高兴还是不高兴。与旧代码的兼容性被打破。对于这样的重大变化,以某种方式强制激活新功能是一个好主意(通过编译开关或#pragma)。


例如,我的auto_ptr。

template <typename T_>
class auto_ptr
{
public:
   T_ *p;
   void reset()  {if(this.p) delete this.p; this.p=NULL;}
   auto_ptr(void *ptr=NULL): p(ptr)  {}
   ~auto_ptr()  {this.reset();}
   void swap(auto_ptr<T_> &other)
   {
      T_ *buf = this.p;
      this.p = other.p;
      other.p = buf;
   }
};

现在发现auto_ptr可以在新的代码中被复制(除非复制操作符/构造器被沉默),这将导致一个指针的多次删除。

 
 

文件MQL5\Include\Controls\SpinEdit.mqh

intMaxValue(void) const { return(m_min_value); }

 

我如何下载MT4?
我下载了mt4setup.exe文件,安装了它,但平台安装的是mt5。我在哪里可以得到mt4?

 
lukyF: 我怎样才能得到MT4?

我下载了mt4setup.exe文件,安装了它,但平台安装的是mt5。我在哪里可以得到mt4?

你可以从你的经纪人那里下载mt4。这个问题每周都会出现...