MQL5中的OOP问题 - 页 43

 
Igor Makanu:

SZS: 你的帖子几乎都是合理的,但对材料的表述,嗯,不完全是出于好意,当然是你的事,但我认为,你想帮 - 助,想耍小聪明,嗯,结果往往是这样的

这场比赛让你想到...你写道,你已经开始思考代码的问题,而之前你是随心所欲地编写代码...

 
A100:

这场比赛让你想到...你写道,你开始思考代码,而在这之前,你在匆忙中编码。

嗯...我从来没有写过一个多德勒!- 这是一个事实!

SZZY:我定期更新这个话题,不是因为无知,也不是因为我自己找不到材料,而是因为有一个代理人的意见让我感兴趣;)

 
Koldun Zloy:

这里有一个例子。

从你的代码来看,不清楚这个接口是干什么用的,所以我把它扔了。

当然,我并不完全了解你的任务,但有99.99%的机会不需要它。

邪恶的...

 
Igor Makanu:

嗯...我从来没有在模糊的情况下写过东西!- 这是一个事实!

SZZY:我定期更新这个话题,不是因为无知,也不是因为我自己找不到材料,而是因为有一个资产,我对他的意见感兴趣;)

你能学到一些东西是非常好的。但如果你阅读Stroustrup的C++,你可以取得更大的进步。

但你最好不要阅读关于哈布拉的文章和各种视频。任何人都可以在那里写作。他们只会让你感到困惑。

 

出现了一个问题。


有一个带有按钮的面板,每个按钮将执行一些功能。按下其中一个按钮所调用的函数,我们称它为Exit1,应该放在一个单独的类CExit1 中。

但这些函数使用了一些全局变量 和其他对象的方法。

我没有参加过大型项目。我想知道专家的意见,怎么做才是正确的?

我经常以这样的方式进行编程,如果一个mq4文件被编译,所有的类和include-files都被加载,没有错误,EA也能正常工作。然而,如果我单独编译一个类,我就会得到警告,因为一些外部变量和函数是不可见的。

这是我的问题。一个类必须在没有错误的情况下自行编译,我的意思是,它必须包含EA的全局变量、对象引用等所有使用的副本?如果是这样,什么时候是最佳时机?如果有很多相互作用的对象,如何安排它们,以减少混乱?如果你的程序激增,你是否会创建程序的图表?

分享你是如何用你的对象编写和实施工作的。

 
Vasiliy Pushkaryov:

出现了一个问题。


有一个带有按钮的面板,每个按钮将执行一些功能。按下其中一个按钮所调用的函数,我们称之为Exit1,应该放在一个单独的类CExit1 中。

但这些函数使用了一些全局变量 和其他对象的方法。

我没有参加过大型项目。我想知道专家的意见,怎么做才是正确的?

我经常以这样的方式进行编程,如果一个mq4文件被编译,所有的类和include-files都被加载,没有错误,EA也能正常工作。然而,如果一个类是单独编译的,可能会出现一些警告,因为一些外部变量和函数对类是不可见的。

问题是。类本身是否有必要在编译时不出错,我的意思是已经包含所有使用过的全局变量的副本,对对象的引用等?如果是这样,什么时候是最佳时机?如果有很多相互作用的对象,如何安排它们,以减少混乱?如果你的程序激增,你是否会创建程序的图表?

分享你是如何用你的对象编写和实施工作的。

全局变量和统计数字,除了平台固有的变量和统计数字外,是一种邪恶的东西。而所有的实体(类组)都必须被隔离,并根据一个协议(接口的协议)而不是其他的协议相互沟通。

这当然是最理想的状态 :-)在现实生活中,你做出决定并支持自己,因为没有人知道你的项目、想法和风格。

 
struct A
{
   int x,y;
};

//+------------------------------------------------------------------+
void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   //b = c = a;  //'operator=' - parameter passed as reference, variable expected
}

1. 为什么不编译?

2.是否有一个黑客来描述operator= ,并在其中使用本地的复制操作符?....即以某种方式调用::=

 
Igor Makanu:

1.为什么不编译?
2.是否有一个黑客来描述operator= ,并在其中使用本地的复制操作符? ....即以某种方式调用::=

1)MQL中的默认赋值运算符返回无效数据类型
2)你可以做这样的事情。

struct A{
   int x,y;
   
   A(){}
   A(const A &a){
      this.x = a.x;
      this.y = a.y;
   }
   A operator=(const A &a){
      this.x = a.x;
      this.y = a.y;
      return a;
   }
};

void OnStart(){
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;  
}
 
Sergey Dzyublik:

1)MQL中的默认赋值运算符返回void数据类型

不同意。

struct A
{
   int x[];
};
//+------------------------------------------------------------------+
A myfunc(const int size)
{
   A result;
   ArrayResize(result.x, size);
   for(int i = 0; i < size; i++) result.x[i] = i + 1;
   return(result);
}
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   a = myfunc(5);
   A b;
   b = a;            // скопировали
   b.x[0] = 99;      // изменили 1-й элемент, чтобы убедиться, что это копия а, а не ссылка как в C#
   ArrayPrint(a.x);
   ArrayPrint(b.x);
}
//+------------------------------------------------------------------+

2020.04.18 18:54:03.855 tst (EURUSD,H1) 1 2 3 4 5

2020.04.18 18:54:03.855 tst (EURUSD,H1) 99 2 3 4 5


显然,默认的赋值运算符会返回完整的数据类型 并进行复制,否则我们在谈论的是什么空?


2.这个例子很好,但我想保留使用默认的复制操作符在数组结构中复制的可能性--我检查过了,一般来说,它在动态数组中工作得很好,有几个细微的差别,但现在的问题是不同的。

 
Igor Makanu:

默认的赋值运算符 显然会返回完整的数据类型 并进行复制,否则我们说的是什么空呢?

错了。

只要定义你的operator=,它返回这个,你就会看到不同。

当赋值的结果再次被分配时,你可以看到它。

struct A
{
   int x;
   int y;
   
   A operator=( const A& a )
   {
      x = a.x;
      y = a.y;
      
      return this;
   }
};

void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;
}