学童的EOP。 - 页 16

 

我请版主把所有的讨论放在一个单独的主题中。可能有几十个这样的主题在讨论OOP的优势。

 
Alexey Viktorov:

还有一个问题:声明一个变量、获取/创建一个指针、创建一个对象实例之间有什么区别。这不是区别,而是在哪些情况下使用更好。例如,只需声明一个用于开仓的变量即可。

以及在什么情况下使用指针更好,什么情况下我们不能没有对象实例。

一种方法或另一种方法的优点和缺点是什么?

1.如果一个对象在全局范围 内,它就是一个静态对象。它被放置在静态内存中,只要程序存在就会存在。

它的构造函数在调用程序的第一个函数之前被调用。解构器在OnDeinit()之后被调用。

2.在函数内声明的对象是本地对象。它们被放置在堆栈中。它们在退出函数时被销毁。
你可以在大括号内声明一个本地对象。


例如,像这样。

if( ... )
{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

或者甚至像这样。

{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

它将在退出街区时被销毁。当它被销毁时,会调用析构器。

由于堆栈的大小通常是有限的,非常大的对象不能放在堆栈中。

3.由新操作符创建的对象是在动态内存(堆)中。
它们一直存在,直到它们被删除操作者明确地消除。


例子。

void func()
{
  Myclass* pObject = new MyClass();
}

在这个例子中,有两个变量被创建。堆中的MyClass类的一个对象。

而pObject变量是一个指向MyClass的指针。这个变量被分配给动态内存中的对象的地址。

当从函数中退出时,pObject变量将被销毁,但该对象将保留在动态内存中。

为了能够删除它,它的地址必须被储存在某个地方。

当它们被创建和销毁时,构造函数和析构函数也被调用。

动态变量的访问时间通常比局部变量要长。


在创建一个对象时,你应该考虑到这一切。


 
Koldun Zloy:

1.如果一个对象在全局范围 内,它就是一个静态对象。它被放置在静态存储器中,只要程序存在就会存在。

...

而且没有人会说什么,甚至ZyXpert也不会。
 
Koldun Zloy:

我是否正确地认为,通过这个选项

#include <Trade\Trade.mqh>
CTrade trade;

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade trade;
 trade.Buy(0.1);
}

在不考虑编译器警告的 情况下,该位置可能以一个不等于123的神奇数字打开?

也就是说,在OnTick函数中会创建一个新的对象,魔术师在其中不等于123。

 
Alexey Viktorov:

我是否正确地认为,通过这个选项

在不考虑编译器警告的 情况下,该位置可能以123以外的神奇数字打开?

也就是说,一个新的对象将在OnTick函数中被创建,而魔术师在其中不会等于123。

设置专家的魔法号码

 
Alexey Viktorov:

我是否正确地认为,通过这个选项

在不考虑编译器警告的 情况下,该位置可以用一个神奇的非123?

也就是说,一个新的对象将在OnTick函数中被创建,它的MagicNumber不是123。

是的,这是正确的。这是两个不同的对象。由于OnTick中的本地对象与全局对象的名称相同,所以只有它可以在OnTick函数中被访问。全局对象超出了范围。因此,对于本地贸易对象,MagicNumber还没有被设置。

 
Alexey Viktorov:

我是否正确地认为,通过这个选项

#include <Trade\Trade.mqh>
CTrade trade;   // Объект № 1 в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade trade;  // Объект № 2 в локальной области OnTick()
 trade.Buy(0.1);
}

在不考虑编译器警告的 情况下,该位置可以用一个神奇的非123?

也就是说,一个新的对象将在OnTick函数中被创建,而魔术师将不会在其中被123。

这与变量的情况完全一样。

还有重点。

#include <Trade\Trade.mqh>
CTrade trade;   // Объект trade в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade *trade_ptr=GetPointer(trade);  // Указатель на объект trade
 trade_ptr.Buy(0.1);
}
 
为什么一开始就需要这个SetExpertMagicNumber
 
Сергей Таболин:
为什么一开始就需要这个SetExpertMagicNumber

它为贸易类的对象设置了一个神奇的数字。整个程序可以有一个以上的 CTrade 类对象,就像现在 kodobase 中的做法一样。这是一个对象。该对象用于执行交易操作。没有必要为整个程序创建一个对象,并在每次需要改变新的魔术师、滑移和其他在初始化期间设置的参数时对其进行重置。可以为每个交易的符号创建一个单独的交易对象,根据符号的属性为其设置必要的参数,这个特定的CTrade类的对象属于这个对象,并通过从必要的符号获得必要的交易类对象的指针来轻松进行交易,而不需要覆盖在此设置的参数。
为了与另一个魔术师合作,可以定义一个单独的交易对象,并进行适当的设置。一个EA中可以有几个巫师。

这一切都取决于对什么和如何使用它的理解。

 
Artyom Trishkin:

它为一个贸易类的对象设置一个魔法。整个程序不可能只有一个CTALT类的对象,因为它通常在kodobase中是这样做的。 这是一个对象。该对象用于执行交易操作。没有必要为整个程序创建一个对象,并在每次需要改变新的魔术师、滑移和其他在初始化期间设置的参数时对其进行重置。可以为每个交易的符号创建一个单独的交易对象,根据符号的属性为其设置必要的参数,这个特定的CTrade类的对象属于这个对象,并通过从必要的符号获得必要的交易类对象的指针来轻松进行交易,而不需要覆盖在此设置的参数。
为了与另一个魔术师合作,可以定义一个单独的交易对象,并进行适当的设置。一个EA中可以有几个巫师。

这一切都取决于对什么和如何使用它的理解。

在这种情况下,是否

SetExpertMagicNumber
Устанавливает идентификатор эксперта

不正确的描述?

我的理解是,如果为EA设置,那么任何订单/仓位都应该有这种魔力。((