mql5语言的特点、微妙之处以及技巧 - 页 213

 
A100 #:

而且不需要改变现有函数的行为--只需添加 新的正确的函数(有一些前缀/后缀),并宣布以前的函数过时,并给出相应的警告即可

破坏了FileReadArray的整个意义?把这些功能看作是一块内存的备份。只是字节。

 
fxsaber #:

破坏了FileReadArray的全部意义?把这些功能看作是一块内存的备份。只是字节。

所以你想先通过私人、const为自己制造困难,然后通过 "直接 "内存访问英勇地克服它们?

我有一个不同的方法--如果出现这样的需求,就意味着程序从一开始就设计不当了

 
A100 #:

也就是说,你建议首先通过私下的、约束性的方式为自己制造困难。

我总是从私人/const中获得巨大的利益。它们允许你很好地控制程序的架构。

然后用 "直接 "内存访问英勇地克服它们?

没有克服。一切都非常简单和合乎逻辑。

我的方法是不同的--如果出现这样的需求,就意味着这个程序从一开始就设计错误了。

我理解他们准备把所有东西都写在堆里(没有private/const),为了OOP的 "纯洁性 "而剥夺了架构控制的便利性。

 
Ilyas #:

该文件...在隐私和恒定性不存在的时候出现,我们还没有想到要改变这种行为,因为我们认为它并不重要。

最近出现了CharArray<->Struct,但它们在private/const下运行良好。希望他们不会被修改。

 
为了代码的简洁性,应该为结构编写序列化和反序列化方法。那么就不会有隐私冲突,如果常量字段在反序列化过程中可以被改变,那么它们就不是常量。
 
fxsaber #:

我理解你准备把所有东西都写在堆里(没有private/const),为了OOP的 "纯洁性 "而剥夺了架构控制的便利。

你误解了--从OOP的角度来看,对象是自给自足的(它不需要外部函数)--因此与私有化没有冲突。而如果与const有冲突,正如正确指出的那样。

是你们人为地使他们如此
 
fxsaber #:

我理解你准备把所有东西都写在堆里(没有private/const),为了 "纯粹 "的OOP而剥夺了架构控制的便利性。

你愿意使用任何直接内存访问的漏洞,而不是使用不太方便但更安全的规范方法。

 
TheXpert #:

恰恰相反,你愿意使用任何直接内存访问的漏洞,而不是使用不太方便但更安全的规范方法。

两个要求。

  1. 显示保存和加载结构的代码。
  2. 非正统方法的危险性的一个例子。
 

嗯,这是一个凶猛的错误。例子。

class C{
   static uint count;
   const uint number;
public:
   C():number(++count){PrintFormat("C[%i]",number);}
  ~C(){PrintFormat("~C[%i]",number);}
   uint Number() const {return number;}
};
uint C::count=0;

void OnStart()
{
  C c[3]={};
  for(int i=0;i<ArraySize(c);Print(c[i++].Number()));
}
2021.11.18 16:03:31.424 test (EURUSD,M1)        0
2021.11.18 16:03:31.424 test (EURUSD,M1)        0
2021.11.18 16:03:31.424 test (EURUSD,M1)        0
2021.11.18 16:03:31.424 test (EURUSD,M1)        ~C[0]
2021.11.18 16:03:31.424 test (EURUSD,M1)        ~C[0]
2021.11.18 16:03:31.424 test (EURUSD,M1)        ~C[0]

内存被分配,当它被释放时,析构器被调用(这暗示了根据RAII的预期行为),但是当对象被创建 时,构造器被忘记被调用))。

 

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

mql5的特殊性,技巧和窍门

Vladimir Simakov, 2021.11.18 14:11

  for(int i=0;i<ArraySize(c);Print(c[i++].Number()));

我以前没有见过。