MQL5中的OOP问题 - 页 37

 
Koldun Zloy:

这都是可以理解的。不清楚为什么SetSaveRequired()和GetSaveRequired()是非静态的,而是写到一个静态变量

我不明白,这就是为什么我请求帮助。 我很少使用修改器,更直观,但我总是希望得到最好的解决方案。

让我在代码中试一下,它是这样的

//+------------------------------------------------------------------+
interface IStrategy
{  double      Strategy();
   bool        Finalize(); };
//+------------------------------------------------------------------+
class CStrategy: public IStrategy
{
public:
   bool              GetSaveRequired() { return(CStrategy::f_save_required); CStrategy::f_save_required = false;  }
protected:
   static bool       f_save_required;
   double            ProfitStrategy;
   void              SetSaveRequired() { CStrategy::f_save_required = true;                                       }
   void              RunStrategy();
   virtual void      NextStepStrategy();
   void              EndStrategy();
};

//____________________________________________________________________
void CStrategy::RunStrategy(void)
{  ProfitStrategy = 0.0;
   SetSaveRequired();
//...........    
}
//____________________________________________________________________
void CStrategy::EndStrategy(string func)
{ //...........    
   SetSaveRequired();
}
//____________________________________________________________________
#define CLASS(NAME) class NAME : public CStrategy{\
public:\
   NAME(SSettingsForOrder &set)  { m_setting = set;}\
   ~NAME()                       { delete m_order; }\
   virtual void NextStepStrategy();}
//+------------------------------------------------------------------+
CLASS(CStrategy_XXX);
CLASS(CStrategy_YYY);
CLASS(CStrategy_ZZZ);

void CStrategy_XXX::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_YYY::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_ZZZ::NextStepStrategy(void) { SetSaveRequired();   //...........     }


公共的GetSaveRequired()被用在一个类中,用来管理所有这些策略的zoo

在这种模式下,我只写了NextStepStrategy 方法--只有其中的TC有变化,其他都是一样的,因此在基类 CStrategy 我收集了所有的方法和所有的字段--它们并不多

ZS:用我的背,我觉得不是王牌我的代码,但它肯定会工作,不会产生重复的变量f_save_required

 
Igor Makanu:

这就是我不明白的地方,这就是我请求帮助的原因。 我很少使用修改器,我更多的是凭直觉使用,但像往常一样,我希望有最好的解决方案

让我在代码中试一下,它是这样的


公共的GetSaveRequired()被用在一个类中,以管理所有这些策略的zoo

在这种模式下,我只写了NextStepStrategy 方法--只有其中的TC有变化,其他都是一样的,所以在基类 CStrategy 我收集了所有的方法和所有的字段--它们并不多

ZS:用我的背,我觉得不是王牌我的代码,但它肯定会工作,不会产生重复的变量f_save_required

我将完全删除这些功能。

所有不改变结构的函数,使它们成为常数。

所有非常量函数都应该设置写标志。

我还会添加Save( int fileHandle )函数。这个函数应该写入结构并重置标志。

你可以做一个静态函数来获取标志的状态。

if( CStrategy::GetSaveRequired() )
{
   int fileHandle = FileOpen( ... );
   for( int i = 0; i < 10; i++ )
   {
      strategies[i].Save( fileHandle );
   }
   FileClose( fileHandle );
}
 
Koldun Zloy:

我将完全删除这些功能。

使所有不改变结构的函数成为常量。

所有非常量函数都应该设置写标志。

我告诉你,我对一般的修饰语有困难。


SZY:与此同时,在网络上的编程讨论中,一般会出现什么情况--上个月在hobber上有一篇关于const的文章,意思是--这个const是没有必要的,看汇编代码没有const也是一样的--编译器会把它全部拿走((

 
Igor Makanu:

我告诉你,我对一般的修饰语有困难。

我上网查了一下,读了一下,又出问题了......。

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z); 
 }
//+------------------------------------------------------------------+

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

预计至少会得到Print("const") 一次。
 
Igor Makanu:

搜索,阅读,又出错了......。

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

预计至少会得到Print("const") 一次。
class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }
这是一个常量类的重载。
 
Vladimir Simakov:
这是一个常量类的重载。

嗯......对了,我花了近半个小时阅读中心和论坛,但我无法掌握它的窍门。

谢谢!现在我明白了

仍然有这样一个例子的疑点。

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  const void f(int v) { x = v; Print("(const) x = v ");  }

};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) const.

2019.09.13 22:04:34.295 tst (EURUSD,H1) const.

2019.09.13 22:04:34.295 tst (EURUSD,H1) const.


给出了相同的数值,但观点却截然不同?- 然后你又需要大厅的帮助。
 
我现在正坐在一个关于OOP的讲座上。也许我会和你分享一些有用的东西 ))。
我可以下载当前的讲义。当然,到目前为止,都是些琐碎的东西。
 
Nikolai Semko:
我现在正在听一个关于OOP的讲座。 (也许我会分享我将学到的东西))
我可以下载当前的讲座。当然,到目前为止,都是些琐碎的东西。

好吧,你的讲座很可能是用胡言乱语,而在这里你几乎学不到任何俄语,你已经在互联网上转了三圈......。 总体情况是严峻的,就像在论坛上一样,真正的程序员--资源上不超过10个人,其余的都是怪人。

好了,整体情况已经理清了const,我和其余的修改者一起工作,所以我有很多理论 ...我需要应用它,但我觉得自己像个学生)))。

 
Igor Makanu:

好吧,你的讲座很可能是用胡言乱语,而在这里你几乎学不到任何俄语,你已经在互联网上转了三圈......总体情况与论坛上的情况类似,真正的程序员不超过10人,其余的都是怪人。

好了,整体情况已经清除了const,我已经和其余的修改者合作了,所以我已经有足够的理论...我觉得自己像个学生)))。

是的,我也有类似的情况。学习并不难,难的是重新训练,打破旧习惯。我仍然无法摆脱程序化编程的许多坏习惯。

 
Igor Makanu:

我想举个例子,我告诉你,我根本不擅长使用修饰语。


SZY:此外,在一般的恐怖什么是怎么回事在网络上的编程讨论 - 这里是一个关于const的文章上个月,霍伯的意思 - 是的,这个const是没有必要的,看汇编代码没有不同,没有const - 编译器将删除一切(())。

你现在可以简单地忘记常数和静力学。在接口方面也是如此。

当一切准备就绪后,就可以把一些东西标记为静态的,一些东西标记为常量的。 然后你就可以完全忘记接口。