通用类库 - 错误、说明、问题、使用功能和建议 - 页 25

 
Andrey Pogoreltsev:

只是,如果它们只适用于嵌入式类型,为什么要创建集合并把它们放在kodobase中)?

它们对嵌入式结构也不好。

 
Andrey Pogoreltsev:

告诉我,也许我不明白什么,但如果我试图使用这种类型的结构。

我得到一个错误。

'Option' - 对象只通过引用传递 ICollection.mqh 14 18

而接下来有一整堆的错误...

这将不会起作用,通过一个模板需要做的模板,我也曾处理过这个问题,这里是一个测试的例子,它似乎工作正常

class CData - 我们要存储在列表中的结构。

CDataBase - 列表本身

#property strict
#include <Arrays\List.mqh>

//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
   datetime          t;
  };
//+------------------------------------------------------------------+
template<typename TDB>class CDataBase
  {
private:
   CList            *mlist;
   TDB              *TDBptr;
public:
   void CDataBase()           { mlist=new CList;                                       }
   void ~CDataBase(void)      { delete mlist;                                          }
   int ArraySize(void)        { return(mlist.Total());                                 }
   TDB *operator[](int index) { return(mlist.GetNodeAtIndex(index));                   }
   void  AddValue (TDB &value){ TDBptr = new TDB; TDBptr  = value; mlist.Add(TDBptr);  }
   string TypeName()          { return(typename(TDB));                                 }
   };
//+------------------------------------------------------------------+
// проверка, запишем  распринтуем значения
void OnStart()
  {

   CDataBase<CData>*data=new CDataBase<CData>;
   CData *my=new CData;

   int i;
   Print("1------------------------------------");
   for(i=0; i<10; i++)
     {
      my.x=i;
      my.y= i*2;
      data.AddValue(my);
      Print(i," : ",data[i].x," , ",data[i].y," / ",my.x," ,",my.y);
     }
   Print("2------------------------------------");
   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete my;
   delete data;
  }
//+------------------------------------------------------------------+

在OnStart()中,我们创建了一个列表,向其中写入数值,然后读取它们。 我检查了2次,因为一开始在向列表写入时,我失去了一个局部变量 的可见性--我过去写的时候一切正常,但当我读取时,我得到了空指针和错误

 
Igor Makanu:

它不会那样工作,你必须使用模板,我也在处理这个问题,我做了一个测试的例子,它似乎都能正常工作。

class CData - 我们想要存储在列表中的结构

CDataBase - 列表本身

在OnStart()中--创建一个列表,向其中写入数值,然后读取它们。 我检查了两次,因为首先在向列表写入时,我失去了某个局部变量 的可见性--我在写入时一切正常,但在读取时,我得到了空指针和一个错误

你的代码可以工作,因为CData仍然是一个类,而不是一个结构。如果你试图同时对类和结构使用生成器,你会遇到问题,特别是在删除操作符方面。通过我自己对这种 "通用 "的实验,我对它深信不疑。问题是,这个 "通用 "库根本没有删除操作符,如果你在这样一个 "集合 "中添加一个新的类,在退出程序后会有很多丢失的对象。也就是说,很明显,最初这个泛型是只为原始类型而写的。

 
Vasiliy Sokolov:

这段代码对你有用,因为CData是一个类,而不是一个结构。如果你试图对类和结构同时使用泛型,你会有问题,特别是在删除操作符方面。通过我自己对这种 "通用 "的实验,我对它深信不疑。问题是,这个 "通用 "库根本没有删除操作符,如果你在这样一个 "集合 "中添加一个新的类,在退出程序后会有很多丢失的对象。也就是说,你可以看到这个泛型最初只为原始类型而写。

我已经停止在MQL中使用结构了,结构没有任何优势,但是在使用结构的过程中会不断出现bug和浪费时间--我看了老管理员关于结构问题的帖子,他们基本上会说使用类而不是结构--我现在根本不使用结构了

SZZ: 我在停止使用结构时发现了这个https://www.mql5.com/ru/forum/6343/page866#comment_7541747

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2018.05.23
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Andrey Pogoreltsev:

如果它们只适用于嵌入式类型,为什么要创建集合并把它们放在kodobase中呢?)

作为标准的便利性。因此,不需要拉 - 每个用户都有一个。

我在我的一个KB库里长期使用这个。

 
Igor Makanu:

它不会那样工作,你必须使用模板,我也在处理这个问题,我做了一个测试的例子,它似乎都能正常工作。

class CData - 我们想要存储在列表中的结构

CDataBase - 列表本身

在OnStart()中--创建一个列表,向其中写入数值,然后读取,我检查了2次,因为起初在某个地方,当向列表写入时,我失去了一个局部变量 的可见性--我曾经写入一切都很好,但当我读取时,我得到了空指针的读取,得到了一个错误。

首先,你在一个列表上实现了你的分配器,并在那里存储指针。不仅如此,你在销毁时还会有漏网之鱼)。

第二,你应该正确地使用复制构造函数而不是赋值运算符。但这都是IMHO)

而最重要的是:开发者只需要最终确定泛型,在里面做分配器并支持自定义对象。C++已经为他们发明了一切)而我们也不需要发明自行车。

 
Andrey Pogoreltsev:

首先,你已经在一个列表上实现了你的分配器,并在那里存储了指针。不仅如此,你在销毁时还有漏网之鱼)

你是如何检测出泄漏的?

SZZ:这是一个测试例子,我必须弄清楚如何在MQL中处理列表,所以我做了测试。

 
Andrey Pogoreltsev:

而最重要的是:开发者应该直接完成泛型,在里面做分配器,并支持自定义对象。C++已经为他们发明了一切)而我们也不需要发明自行车。

如果这么简单就写吧。

 
Igor Makanu:

如何检测到泄漏的?

ZS:这是一个测试例子,我必须弄清楚如何在MQL中处理列表,所以我做了测试。

你在AddValue中通过new创建了对象的副本,但你并没有在析构器中释放它们,你只是清除了指针列表。

 
TheXpert:

如果有那么简单,就写吧。

当我有时间和需要时,我就会写。而一般来说,作为一个例子,如果你只需要一个轴承型号,建立自己的轴承厂并不是一个好主意)