关于OOP(面向对象的编程)的问题 - 页 8

 
C-4:
不幸的是,Typeid()并不存在,而模板的优势在于静态识别。不同的任务由不同的方法来解决,说一种方法不好,另一种方法好,是一种加重的假设。

我有一个案例,需要进行动态识别。所有的解决方案都非常繁琐,除了通用型。通过一个实现通用类型的类来做。

但我也遇到了麻烦。自VS 2012以来,STL(字符串)发生了一些变化,从那时起它就无法编译了。我还没有把它整理出来。

 
Pavlick:

嗯,不是路标,而是棍子上的笑声。


我帖子中第二个链接 的页面说。

在MQL4中,你可以动态地创建复杂类型的对象。这是用new操作符 完成的,它返回创建对象的描述符。

该描述符的大小为8 字节。在语法上,MQL4中的对象描述符类似于C++中的指针。

例子。

MyObject* hobject= new MyObject();

同样,与C++不同, 上例中的 hobject变量 不是内存的 指针,而是一个对象描述符


 
EverAlex:

我帖子中第二个链接 的页面说。

在MQL4中,你可以动态地创建复杂类型的对象。这是用new操作符 完成的,它返回创建对象的描述符。

该描述符的大小为8 字节。在语法上,MQL4中的对象描述符类似于C++中的指针。

例子。

MyObject* hobject= new MyObject();

同样,与C++不同, 上例中的 hobject变量 不是内存的 指针,而是一个对象描述符

mql5 同志在这里澄清了情况https://www.mql5.com/ru/forum/150943/page6#950107 。我在不知不觉中反应过度了。
 

我不早于昨天向技术支持部门询问了将类的实现文件与接口文件分开的问题。而我得到了一个答案。

В MQL нет файла проекта, фактически им выступает mq4 файл, а программа обязана иметь точки входа (при их отсутствии выдаётся ошибка "event handling function not found"). Поэтому при разделении интерфейса от реализации класса, файлом-реализации и интерфейса должны быть mqh файлы.

底线是,这基本上不是一个合理的选择。毕竟,带有类的实现的文件是一个实现文件,以保护它不受客户的影响。如果它们都是开放的形式,即.mqh 格式,那么我们为什么要这样做呢?

 
hoz:

我不早于昨天向技术支持部门询问了将类的实现文件与接口文件分开的问题。而我得到了一个答案。

底线是,这基本上不是一个合理的选择。毕竟,带有类的实现的文件是一个实现文件,以保护它不受客户的影响。而如果它们都是开放的形式,即.mqh 格式,那么为什么还要这样做呢?

我从不把声明和实现分开。我把一切都写在头文件里。这就更方便了。你必须跟踪一个文件,而不是两个。如果一个类中只有三个方法,我很高兴。但如果有100个呢?你会厌倦比较这两个文件的。你会在一个地方写作,而在另一个地方忘记......。

只有一种情况下需要分割文件。这就是两个或更多的班级相互参照的情况。应该避免这种解决方案。这对C++来说是真的。我不知道如何在MQL中做到这一点。

 

教科书 中,特别是这里的代码。

//+------------------------------------------------------------------+
//| Класс, реализующий элемент списка                                |
//+------------------------------------------------------------------+
class CItem
  {
   int               m_id;
   string            m_comment;
   CItem*            m_next;
public:
                     CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                    ~CItem() { Print("Destructor of ",m_id,
                                     (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                     "dynamic":"non-dynamic"); }
   void              Initialize(int id,string comm) { m_id=id; m_comment=comm; }
   void              PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
   int               Identifier() { return(m_id); }
   CItem*            Next() {return(m_next); }
   void              Next(CItem *item) { m_next=item; }
  };
//+------------------------------------------------------------------+
//| Простейший класс списка                                          |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };

以下是可用的字段。

void              Next(CItem *item) { m_next=item; }

 bool             InsertToBegin(CItem* item);
为什么一个案例 中的* 在右边,另一个案例中的 * 在左边
 
hoz:

教科书 中,特别是这里的代码。

有这样的字段。

为什么 * 一种情况下是在右边,而在另一种情况下是在左边

它是这样说的。这并不重要。

我自己写 "*"运算符来表示其右边的类型旁边的指针(int*),以及在其左边解除引用一个变量时(*pnVal)。

 
Zhunko:

这就是它所说的。这并不重要。

我自己写的 "*"运算符表示一个指针在其右边的类型旁边(int*),当取消引用时,在其左边的一个变量旁边(*pnVal)。

我想也是。也许是一个不专心的程序员写了这个样本。

那里还有一些其他奇怪的东西。

 CItem*            m_next;

这是否意味着CItem 类被分配了一个对象描述符 m_next

 
hoz:

教科书 中,特别是这里的代码。

以下是可用的字段。

为什么一个案例 中的* 在右边,另一个案例中的 * 在左边

它不在左边或右边,而是在两者之间。
 
hoz:

我也是这么想的。我猜一个不专心的程序员写了这个例子。

那里还有一些其他奇怪的东西。

这是否意味着Citem 类被分配了对象描述符m_next


这意味着必须使用new操作符 来创建一个实例。