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

 
Artyom Trishkin:
  1. 我的意思是,终端子系统自动删除你创建的所有对象,并把它们的指针放在列表中,你称之为拐杖,而你不认为手动处理对象并为其创建拐杖是拐杖。
  2. 这不是你在第一项中所说的一部分,也是我回应的主要原因。
  3. 这也是,而且是出于同样的原因。

你创建集合是为了什么,为了集合和自动删除对象?)我根本没有说过任何关于手动操作的事情。你从哪里得到的?)

研究STL,你就会明白我在说什么。

 
Igor Makanu:

如何正确复制,你能给这个模板一个例子吗?

我用帮助写了AddValue方法https://www.mql5.com/ru/docs/basis/types/classes

我绞尽脑汁,但除了我在例子中写的,我在MQL中没有看到任何其他解决方案

让我看看你对正确的数据存储的实施。

这就是我在你的案例中的意思。
void  AddValue (const T &value)  { Tptr = new T(value); mlist.Add(Tptr); }

但无论如何,这个解决方案是错误的。一个正常的解决方案是使用类似STL的东西。在你的例子中是std::list。

我认为MQL5并没有限制它。你可以尝试将STL源从同一个VS翻译成MQL

 
在老一代的版主中,至少有两个专业的程序员。现在没有了。而且非常明显 )
 
Andrey Pogoreltsev:
这就是我在你的案例中的意思。

但这仍然是错误的解决方案。通常的解决方案是使用类似STL的东西。在你的例子中是std::list。

我不认为MQL5没有限制它。你可以尝试将STL源代码从VS翻译成MQL

再次强调:MQL不是C++。

而MQL中对象的指针实际上是一个句柄,而C++中的指针是一个物理内存地址。

将C++库移植到MQL有什么意义?

 
Igor Makanu:

再次强调:MQL不是C++。

而MQL中的对象指针实际上是一个句柄,C++中的指针是一个物理内存地址。

将C++库移植到MQL有什么意义?

要正确实现设计模式,而不是用泛型来制造潜在的问题。

你一定很惊讶,但操作系统的指针也是虚拟的。你仍然要把它们转换成物理的,但这是与指针完全不同的工作水平。

你不可能将1移植到1中,但我认为你能够移植一个剥离的C++03。可提供模板和运营商的支持。

 
Andrey Pogoreltsev:

1.你可能会感到惊讶,但操作系统的指针也是虚拟的。它们仍然需要转换为实物,但这是另一个层次的指针处理。

2.你将无法将1移植到1中,但你将能够移植剥离的C++03。对模板和运营商的支持也是存在的。

1.我不会感到惊讶

2.好吧,事实是这样的--即使你们聚在一起,从C++做一个移植,仍然会引起问题,但为什么不象原来那样呢?- 有何意义?

有一个MQL的标准库,使用它至少可以在某种程度上保证将来会有开发者提供支持。 我已经被烧过几次了--我使用几年前写的文章中的图形组件,它很容易使用,很像用Delphi组件工作,但当我开始尝试实施更严肃的项目时,我得到了很多问题,而文章的作者却没有回应

我不记得是哪位著名的程序员说过这样的话:代码不应该是美丽的或可读的,它必须实现其目的

在我们的讨论中,如果我没有记错的话,你想用列表来存储数据的结构,我给你看了我的实现,我为同样的任务开发的--我的实现是否有效?- 它是否会导致MQL-程序的运行时错误?- 我很想在谈话过程中发现

 

Andrey Pogoreltsev:

我想,C++03是可能的。对模板和操作者的支持。

嗯,是的,祝你好运 ))

 
Igor Makanu:

代码不一定要漂亮或可读,它必须完成它的工作

这只是在你想完善它之前的真实情况。

 

我已经指出了CLinkedList类中的这个错误,但我要重复一下。 列表的开始和结束节点是相互封闭的:最后一个节点的Next指向第一个节点,而第一个节点的Previous指向最后一个节点。 结果,标准的搜索循环变成了一个无限循环。

#include <Generic\LinkedList.mqh>

void OnStart()
{
  CLinkedList<string> list;
   
  list.AddLast("One");
  list.AddLast("Two");
  list.AddLast("Three");
  int i=0;
  for (CLinkedListNode<string> *node= list.First();  node!=NULL;  node=node.Next())  // Цикл бесконечно бегает по кругу
    { }
} 

在C#中,这样的废话自然不会被观察到。 最后一个节点的Next是零,第一个节点的Previous 也是如此。

我不知道这是否是开发者发明的一些 "功能"(虽然我看不出它有什么用处),但无论如何,库的行为应该与原来的行为一致。

 
Alexey Navoykov:

我已经指出了CLinkedList类中的这个错误,但我还是要重复一下。 列表的开始和结束节点是相互封闭的:最后一个节点的Next指向第一个节点,而第一个节点的Previous指向最后一个节点。 结果,标准的搜索循环变成了一个无限循环。

在C#中,自然不会有这样的废话。 最后一个节点的Next是零,第一个节点的Previous 也是零。

我不知道这是否是开发者发明的一些 "功能"(尽管我没有看到它的任何好处),但无论如何,库的行为应该与原版对应。

这里到底又发生了什么?他们正在删除完美的LinkedList帖子。就像这样,在欧洲的某个地方,一个匿名版主正在删除来自可恨的俄罗斯人的帖子,同时恶意地冷笑。真是个垃圾场,它让你不想写。