記事"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に遭遇したことがないので、私は3つの松をさまよっています。どうか理解させてください。

 
kogriv:

つまり。

は、next()というオブジェクト(またはメソッド?)へのポインタの宣言でしょうか?

next()関数はCListItemクラスの 変数へのポインタを返すと書いてあります。
 
kogriv:

そして、中括弧の中で、次のオブジェクトそのものが返されるのですか? 私の理解は正しいですか?

関数の本体は中かっこで囲まれています、

{return(next);}

これは、関数がCListItemクラスのオブジェクトへの ポインタの型を持つ変数nextを返すことを意味します。これは一般的に関数の型と一致しています。

Документация по 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
     {
      //--- 項目を前のオブジェクトのポインタに設定する----------------------- Start of error-----------------------
      item.prev(first);
      //--- 現在の最初の要素のポインタを覚えておく
      CListItem *p=first;
      //--- 入力された項目を最初の項目の代わりに置く
      first=item;
      //--- リストの最初の要素に次のオブジェクトのポインタを設定する
      first.next(p);
     }
  } 
新しいリスト要素では、prevとfirstが2番目の要素を参照しているように見えますが、2番目の要素は1番目の要素への参照を取得していません。
 
Yedelkin:

最初の例の直後、記事には「pstatus 変数はオブジェクト・ポインタ だが、new 演算子でオブジェクトそのものを作成するのを意図的に "忘れ"、PrintStatus()関数のパラメータとして渡した 」というフレーズがある。

1.ポインタなのかオブジェクトなのか?

2.例にはPrintStatus() 関数がない。

遅かれ早かれ。ありがとうございます。文末を削除

最初の例の直後に、「pstatus 変数はオブジェクトのポインタ だが、new 演算子を使ってオブジェクトそのものを作成するのを意図的に "忘れ"、それをPrintStatus()関数のパラメータとして渡している 」という表現が含まれています。

 
220Volt:

エラーがあると思います:

新しいリスト要素では、prevとfirstが2番目の要素を参照しているように見えますが、2番目の要素は1番目の要素への参照を取得していません。

はい、タイプミスです。代わりに

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

の代わりに

else
     {
      //---最初の セット указатель предыдущего объекта
      first.prev(item);
に訂正します。
削除済み  

MQL5とMQL4のポインタと参照についてまだ理解していません。参照渡しとポインターの違いは、余分なコードを除いて何なのでしょうか?C++では違いがありますが、ここではどうなのでしょうか?難しくなければ、もっと詳しい情報を書いてください。