文章 "面向对象编程基础" - 页 3

 

1) 认为此处有错误:

部分:向构造函数传递参数

"Init() "函数在第 私有 部分,以确保类可以重新初始化"。

可能:

将 Init() 函数放在 公共 函数被放在公共部分 ,以提供重新初始化类的可能性。

2) 请举例说明如何在 "对象数组"部分使用 "用类实例(对象)创建数组"功能。遗憾的是,我不知道 "这是用来做什么的"。

3) 在 "关于封装(私有、受保护、公用)的更多信息 "一节中,顺便提到了基类->类的后代。也许这个数据(类 Class:公共 CBase)应该在这一节的开头解释一下,因为我后来才意识到这一点。

4) 没有发现:图 6.额外 "函数(红色箭头)的可见性由加载类的指针类型决定。该示例可在附录中的文件 OOP_sDefaultVirtual_1.mq5 中找到。

5) 我没有找到关于什么是库的明确说明。显然,这是一种存储函数类的方法?也就是说,与包含文件类似,只是包含文件存储为源代码,而库存储为编译后的 dll?

非常感谢你的文章!我对材料的连贯表述尤为满意。

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
bivmail:

1) 认为此处有错误:

部分:向构造函数传递参数

"Init() "函数在第 私有 部分,以确保类可以重新初始化"。

可能:

将 Init() 函数放在 公共 函数被放在公共部分 ,以提供重新初始化类的可能性。

2) 请举例说明如何在 "对象数组"部分使用 "用类实例(对象)创建数组"功能。遗憾的是,我不知道 "这是用来做什么的"。

3) 在 "关于封装(私有、受保护、公用)的更多信息 "一节中,顺便提到了基类->类的后代。也许这个数据(类 Class:公共 CBase)应该在这一节的开头解释一下,因为我后来才意识到这一点。

4) 没有发现:图 6.额外 "函数(红色箭头)的可见性由加载类的指针类型决定。该示例可在附录中的文件 OOP_sDefaultVirtual_1.mq5 中找到。

5) 我没有找到关于什么是库的明确说明。显然,这是一种存储函数类的方式?也就是说,与包含文件类似,只是包含文件存储为源代码,而库存储为编译后的 dll?

非常感谢你的文章!我对材料的连贯表述尤为满意。

1.是的。

2.在 "对象阵列 "一节中有一个示例,实际上整节都是一个附有说明的示例。

3.在 "使用 OOP 更改程序运行逻辑 "一节中考虑了这个问题。

4.4. "该示例位于文件......的附录中 "这句话的意思是,该文件包含了一个用于......4. "本例在文件附录中...... "的意思是,文件中包含本节标题所示章节的例子。这并不意味着示例重复了文章中的所有内容。这些示例可能根本不存在,所有内容都写在文章中。但示例就在那里,你可以以此为基础进行试验。文章是主要的,例子是次要的。

5.Уже давно указано:http://ru.wikipedia.org/wiki/%C1%E8%E1%EB%E8%EE%F2%E5%EA%E0_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

 
谢谢。
 

非常有趣的文章,用 "通俗易懂 "的语言撰写。

感谢作者。

 
谢谢你这篇文章帮了我大忙。我正在将我的 EA 移植到 OOP,在类的数组方面遇到了一个特殊的问题。动态指针得到了清晰而完美的解释。再次感谢。
 
文章写得非常好!多亏了作者,我终于明白了。
 

我有两个基于这篇文章的代码示例,它们都是创建一个指向类的指针数组,然后在退出时删除它们。 但是,一个退出时出现内存泄漏,另一个退出时没有出现内存泄漏。唯一不同的是,第二个示例的析构函数中的 "Alert "被注释掉了。 当析构函数中的 "Alert "被删除时,出现了内存泄漏。 这很奇怪,有人能解释一下吗? 请帮帮我,这快把我逼疯了。

在本文代码示例的末尾,我附上了我写的一个极其简单的代码示例,它也存在内存泄漏问题。同样,为什么???? 最后这个代码示例并不复杂.. .


这段代码可以正常运行,没有内存泄漏:

class CName
  {
private:
   int               m_arg; // 实例变量
public:
                     CName(int aArg)
     { // 构造函数
      m_arg=aArg;
      //Alert("Constructor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // 销毁器
      Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---
CName *cname[]; // 数组

void OnInit()
  {
// 准备数组以加载十个类实例
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // 加载实例
      cname[i]=new CName(i);
     }
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // 最后从内存中卸载所有实例
      delete(cname[i]);
     }
}

专家日志中的信息,注意没有内存泄露:

PI 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 销毁器 0

KP 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 1

JG 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 2

EN 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 3

LF 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 4

OM 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 5

FD 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 6

IK 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 7

HS 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 8

CJ 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 9

该代码退出时有内存泄漏!!!!!为什么????????? 唯一的区别是在析构函数中注释掉了 "Alert"...

class CName
     {
private:
   int               m_arg; // 实例变量
public:
                     CName(int aArg)
     { // 构造函数
      m_arg=aArg;
      //Alert("Constructor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // 销毁器
      //Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---

CName *cname[]; // 数组

void OnInit()
  {
// 准备数组以加载十个类实例
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // 加载实例
      cname[i]=new CName(i);
     }
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // 最后从内存中卸载所有实例
      delete(cname[i]);
     }
}

专家日志中的信息,注意泄露的内存:

FM 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 还剩 10 个未删除对象

EG 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 还剩 10 个 CName 类型的对象

GO 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 200 字节泄漏内存

最后一个 例子,我的代码,非常简单,但退出时内存泄漏....

class CCandleStick
{
public:
   CCandleStick() { };
  ~CCandleStick() { };
};

CCandleStick *cCandleArray[];

//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(cCandleArray, 10);
   for (int i = 0; i < 10; i++) {
      cCandleArray[i] = new CCandleStick();
   }   
  }
//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for (int i = 0; i < 10; i++) {
      delete(cCandleArray[i]);
   }   
   Print("Last Error- ", GetLastError(), "   Current time: ", TimeCurrent());
  }

专家日志中的信息,注意泄漏的内存:

MR 0 测试者 (EURUSD,M1) 14:07:23 最后错误- 0当前时间: 2013.02.06 23:07:23

FL 1 tester (EURUSD,M1) 14:07:23 剩余 10 个未删除对象

KN 1 tester (EURUSD,M1) 14:07:23 还剩 10 个 CCandleStick 类型的对象

JS 1 tester (EURUSD,M1) 14:07:23 160 bytes of leaked memory



Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Date and Time / TimeCurrent - Documentation on MQL5
 
wulidancing:

我有两个例子...

检查了所有三个变量。三个都一样全部正常。没有一个泄漏。在这些示例中,不可能--我们有一个数组,数组的每个元素都有实例,完成后我们删除所有对象。对象不会创建自己的副本,因此不能删除相同的东西。如果对象创建了自己的副本,那么我们在删除时就会遇到困难,很容易遗漏某些内容。显示真正有泄漏的变量。

使用 SRC 按钮插入代码(最好是附加文件)。

对不起,我的英语不好:)

MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
OOP 是一种现代程序语言,但要理解它并编写代码,我们需要大量的时间和精力。感谢好文章
 
Integer:

检查了所有三个变量。三个都一样。全部正常。没有一个泄漏。在这些示例中,不可能是这样的--我们有数组,数组的每个元素都有实例,完成后我们删除所有对象。对象不会创建自己的副本,因此不能删除相同的东西。如果对象创建了自己的副本,那么我们在删除时就会遇到困难,很容易遗漏某些内容。显示真正有泄漏的变量。

使用 SRC 按钮插入代码(最好是附加文件)。

对不起,我的英语不好:)

我不确定您是否看到了我的后续问题。因为我对这个论坛不是很熟悉,所以可能被删除了。 不过,我试着在一台旧电脑上用旧版本的 MetaTrader 运行了所有三个示例。 在旧版本中,所有三个示例似乎都运行正常。 它没有生成专家日志 "内存泄漏 "错误,我想应该是 560 版本吧?我不记得了,我把 560 版本升级到了新的 756 版本。 在新版本之后,我遇到了同样的内存泄漏问题。 旧版本没有报告内存泄漏问题,是不是因为它不是一个功能? 您使用的是哪个版本? 再次感谢。