文章 "在 MQL5 中使用对象指针" - 页 2

 

下午好。我是一名初学者。我有一个关于使用 "*"图标(星号)的问题。

在示例列表文件中

class CListItem
  {
private:
   int               ID;
   CListItem        *next;
   CListItem        *prev;

*"用于声明指向对象的指针--这一点已经很清楚了。

下一个:

public:
                    ~CListItem();
   ...
   CListItem*        next(){return(next);}
   CListItem*        prev(){return(prev);}

不清楚 "*"号的用途。

根据帮助,"可以动态创建复杂类型的对象。 这里没有使用 new 操作符。请更详细地解释如何使用 "*"号,以及在什么情况下使用 "*"号。

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
kogriv:

然而

不清楚这里的 "*"符号是什么意思。


你可以这样写

public:
                    ~CListItem();
   ...
   CListItem        *next(){return(next);}
   CListItem        *prev(){return(prev);}

没有区别,只是设计风格和意识形态上的小区别。

 
Rosh:

可以这样写

没有区别,只是设计风格和意识形态上的一点不同。

例如

CListItem        *next(){return(next);}

这是一个指向对象(或方法?)next()的指针的声明?然后,在大括号中返回的是对象 next 本身? 我的理解正确吗?

我知道一切都应该非常简单,但由于我以前没有接触过 OOP,所以我在三棵松中徘徊。请让我明白。

 
kogriv:

是指向对象(或方法?)next() 的指针的声明?

上面说 next() 函数返回一个指向CListItem 类 变量的指针。
 
kogriv:

然后,在大括号中返回下一个对象本身? 我的理解对吗?

大括号中给出了函数的主体、

{return(next);}

这意味着函数将返回变量 next,它的类型是指向 CListItem类对象的 指针。这通常与函数的类型一致。

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

在第一个示例之后,文章中有这样一句话:"pstatus 变量是一个对象的指针,但我们故意 "忘记 "使用new 运算符创建对象本身,并将其 作为参数传递 PrintStatus() 函数"。

1.不清楚你传递的 "到底是 "什么--指针还是对象?

2.示例中没有PrintStatus() 函数。

 

我认为有一个错误:

//+------------------------------------------------------------------+
//| 向列表中添加一个项目|
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- 首先检查传递指针的正确性
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- 增加列表中的项目数
   m_counter++;
//--- 如果列表中还没有项目
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- 将项目设置为前一个对象的指针----------------------- 错误开始-----------------------
      item.prev(first);
      //--- 记住当前第一个元素的指针
      CListItem *p=first;
      //--- 将收到的项目放在第一个项目的位置上
      first=item;
      //--- 为列表中的第一个元素设置下一个对象的指针
      first.next(p);
     }
  } 
新的列表元素似乎有 prev 和 first 引用第二个元素,而第二个元素没有获得对第一个元素的引用。
 
Yedelkin:

在第一个示例之后,文章中出现了这样一句话:"pstatus 变量是一个对象指针,但我们故意 "忘记 "使用new 操作符创建对象本身,并将其 作为参数传递 PrintStatus() 函数"。

1.不清楚传递的到底是什么--指针还是对象?

2.示例中没有PrintStatus() 函数。

迟到总比不到好。谢谢,已在文章中修正。删除了句尾部分

在第一个示例之后,文章中有这样一句话:"pstatus 变量是一个对象的指针,但我们故意 "忘记 "使用new 运算符创建对象本身,并将其 作为参数传递 PrintStatus() 函数"

 
220Volt:

我认为有一个错误:

新的列表元素似乎有 prev 和 first 引用第二个元素,而第二个元素并没有获得对第一个元素的引用。

是的,有一个错字。应该是

 else
     {
      //--- 设置项目  указатель предыдущего объекта                                         
      item.prev(first);

应该

else
     {
      //--- 设置为第一个 указатель предыдущего объекта
      first.prev(item);
更正。
 

我仍然不理解 MQL5 和 MQL4 中的指针和引用。除了额外的代码,引用传递和指针传递有什么区别?在 C++ 中是有区别的,但在这里有什么区别?如果不难,请写出更详细的信息。