MQL5中的OOP问题 - 页 36

 
Igor Makanu:

嗯,是的,这是一个更好的解决方案!这样就少了一个方法

在OnStart中应该只有一个新的。
 
Koldun Zloy:

1.调用这个函数两次并没有什么问题。

2.你不介意那些反对使用静态函数的人没有给出丝毫的论据吗?

你最好不要随便看别人的视频,而是看书。

我希望 视频的作者https://youtu.be/lfdAwl3-X_chttps://youtu.be/zME4SOCHT0I很多好的东西.....,敲了整整一个星期,我坐下来做的每一件事都开始思考,而不是像以前那样做....你不能使用静态的,这不是OOP!

我想完成这个代码,我有一个问题。

- 我想保存对象的字段,好在,字段被立即放在结构中,你可以通过FileWriteStruct()一键保存它们。

- 一个类有N个对象,都是从一个基类继承而来。

- 因为我看了视频,我希望有些方法可以帮助我不去询问每个对象是否需要保存文件....。在一般情况下,惨败,我们决定不做傻事,创建一个方法,将静态地分配一个标志写到文件中去

class CStrategy: public IStrategy
{
protected:
static bool       f_save_required;
void              SetSaveRequired()        { CStrategy::f_save_required = true;                    }
public:
bool              GetSaveRequired()        { return(CStrategy::f_save_required);                   }

它按计划运作

而问题本身,如果你这样写,会发生什么。

class CStrategy: public IStrategy
{
private:
static bool       f_save_required;
protected:
void              SetSaveRequired()        { CStrategy::f_save_required = true;                    }
public:
bool              GetSaveRequired()        { return(CStrategy::f_save_required);                   }

如果你这样写,会发生什么。

class CStrategy: public IStrategy
{
private:
static bool       f_save_required;
protected:
void              SetSaveRequired()        { f_save_required = true                   }
public:
bool              GetSaveRequired()        { return(f_save_required);                   }
 

试着用不同的方法来修改测试脚本,我看不出有什么不同,给我看看上面的帖子的正确修改方法:(protected / private )和调用M::x或只是x

//+------------------------------------------------------------------+
interface I
{  bool main();

};
//+------------------------------------------------------------------+
class M:public I
{
protected:
static int        x;
bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }
public:
                     M()      { Print(__FUNCTION__);}
                    ~M()      { Print(__FUNCTION__);}
};
//+------------------------------------------------------------------+

static int M::x=0;
//+------------------------------------------------------------------+
class A:public M
{
public:
                     A()      { Print(__FUNCTION__);}
                    ~A()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+
class B:public M
{
public:
                     B()      { Print(__FUNCTION__);}
                    ~B()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+
class C:public M
{
public:
                     C()      { Print(__FUNCTION__);}
                    ~C()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+

void OnStart()
{  I *a = new A;
   I *b = new B;
   I *c = new C;
   I *m = new M;

   a.main();
   b.main();
   c.main();
   m.main();


   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+
 
Igor Makanu:

试着用不同的方法来修改测试脚本,我看不出有什么不同,给我看看上面的帖子的正确修改方法:(protected / private )和调用M::x或只是x

如果是受保护的,那么只有在定义了字段的 的方法中才可以引用,这里的逻辑是通用的。
 
顺便说一句,节日快乐。另一个字节已经发生。
 
Vladimir Simakov:
类的方法 中你调用x,在所有其他地方M::x,如果是保护的,那么只有在定义了该字段的类的方法中才能访问,这里的逻辑是共同的。

对!我在睡觉时做了一个错误的例子,所以我得到了'M::main' - 不能访问私有成员函数。

class M
{
private:
   static int        x;
   bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }
public:
                     M()      { Print(__FUNCTION__);}
                    ~M()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+

static int M::x=0;
//+------------------------------------------------------------------+
class A:public M
{
public:
                     A()      { Print(__FUNCTION__);}
                    ~A()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
class B:public M
{
public:
                     B()      { Print(__FUNCTION__);}
                    ~B()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
class C:public M
{
public:
                     C()      { Print(__FUNCTION__);}
                    ~C()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
void OnStart()
{  A *a = new A;
   B *b = new B;
   C *c = new C;
   M *m = new M;

   a.inc();



   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+

got 'M::main' - cannot access private member function tst.mq5 25 32

如果我把它写下来

protected:   
   bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }

一切按计划进行!

 
Vladimir Simakov:
顺便说一句,节日快乐。 另一个字节发生了。

谢谢你,已经整理好了!

节日快乐!

 
Igor Makanu:

我希望 视频的作者https://youtu.be/lfdAwl3-X_chttps://youtu.be/zME4SOCHT0I很多好东西.....,敲了一星期,我坐下来做的每件事都开始思考,而不是像以前那样做....你不能使用静态的,这不是OOP!

我想完成这个代码,我有一个问题。

- 我想保存对象的字段,好在,字段被立即放在结构中,你可以通过FileWriteStruct()一键保存它们。

- 一个类有N个对象,都是从一个基类继承而来。

- 因为我看了视频,我希望有些方法可以帮助我不去询问每个对象是否需要保存文件....。在一般情况下,惨败,我们决定不做傻事,创建一个方法,将静态地分配一个标志写到文件中去

它按计划运作

而问题本身,如果你这样写,会发生什么。

如果你这样写会发生什么。

一个对象是否需要被保存到文件中,取决于什么?

这个标志对所有对象都是通用的吗?

 
Koldun Zloy:

它依靠什么来把对象保存到文件中?

这是所有对象的共同特征吗?

那么这个问题是辩证的,当然,在这里

- 最好是有10个策略,写10个文件,改变TC的状态(1个TC=1个结构)。

- 或者更合理的做法是,从类中传出一个句柄,每个tick都有一个策略的调用(搜索),所以它们都写到一个文件中。

我认为第二种说法更符合逻辑


事实证明,在所有TC开始之后,你需要写一次10个结构--状态已经改变了。

然后以随机的顺序在需要时写入(触发SL或TP)--在这里,打开文件 并一次性写入10个结构也是比较快的,策略不是点状的,不是每秒钟,每个TS从一分钟到一个小时都有。


到目前为止,我已经实现了对静态变量的描述,并通过get-set、set protected、get public对其进行访问,在调用后还将静态变量重置为false。

 
Igor Makanu:

嗯,这个问题是辩证的,当然,在这里

- 你有10个策略,写10个文件,改变TC的状态(1个TC=1个结构)。

- 或者更合理的做法是,从类中传出一个句柄,在一个tick上有一个策略的调用(搜索),所以它们都写到一个文件中。

我认为第二种说法更符合逻辑


事实证明,在所有TC开始之后,你需要写一次10个结构--状态已经改变了。

然后以随机的顺序在需要时写入(触发SL或TP)--在这里,打开文件 并一次性写入10个结构也是比较快的,策略不是点状的,不是每秒钟,每个TS从一分钟到一个小时都有。


目前,我通过描述一个静态变量,通过Get、Set保护、Get公开来实现--它也在调用后将静态变量重置为false。

这一切都很清楚。不清楚为什么SetSaveRequired()和GetSaveRequired()是非静态的,但却写到静态变量