CTreeNode

CTreeNode は CTree 二進木の節点(ノード)のクラスです。

説明

CTreeNode は CTree 二進木の節点を操作する機能を提供します。ツリーのナビゲーションのオプションは、このクラスで実装されています。その他に、ファイル操作のメソッドも実装されています。

宣言

  class CTreeNode : public CObject

タイトル

  #include <Arrays\TreeNode.mqh>

継承階層

  CObject

      CTreeNode

直接子孫

CTree

クラスメソッド

属性

 

Owner

所有者ノードのポインタを取得/設定します。

Left

左ノードのポインタを取得/設定します。

Right

右ノードのポインタを取得/設定します。

Balance

ノードのバランスを取得します。

BalanceL

ノードの左サブブランチのバランスを取得します。

BalanceR

ノードの右サブブランチのバランスを取得します。

新しい要素の作成

 

CreateSample

新しいノードインスタンスを作成します。

比較

 

RefreshBalance

ノードのバランスを再計算します。

検索

 

GetNext

次のノードのポインタを取得します。

入出力

 

SaveNode

ノードデータをファイルに保存します。

LoadNode

ノードデータをファイルから読み込みます。

virtual Type

ノード型の識別子を取得します。

クラスから継承されたメソッド CObject

Prev, Prev, Next, Next, Save, Load, Compare

実際には CTreeNode クラスの派生クラスのツリーが使用されます。

CTreeNode の派生クラスは事前に定義されたメソッドを持たなければなりません。CreateSample は CTreeNode の派生クラスの新しいインスタンスを作成します。Compare は CTreeNode の派生クラスのキーフィールドを比較します。 Type はノードの識別に必要で、SaveNode 及び LoadNode はファイル操作に必要です。

CTree 派生クラスの例を見てみましょう。

//+------------------------------------------------------------------+
//|                                                   MyTreeNode.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                       https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link     "https://www.mql5.com"
//---
#include <Arrays\TreeNode.mqh>
//+------------------------------------------------------------------+
//| CTreeNode から派生した CMyTreeNode クラスを記述する              |
//+------------------------------------------------------------------+
//| CMyTreeNode クラス                                               |
//| 目的:二分木の要素のクラス                     |
//|             CTreeNode の派生クラス                      |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
 {
protected:
  //--- ユーザデータ
  long              m_long;           // long 型のキーフィールド
  double            m_double;         // double 型のカスタム変数
  string            m_string;         // string 型のカスタム変数
  datetime          m_datetime;       // datetime 型のカスタム変数
 
public:
                    CMyTreeNode();
  //--- ユーザデータアクセスに使用されるメソッド
  long              GetLong(void)                { return(m_long); }
  void              SetLong(long value)          { m_long=value;  }
  double            GetDouble(void)              { return(m_double); }
  void              SetDouble(double value)      { m_double=value;  }
  string            GetString(void)              { return(m_string); }
  void              SetString(string value)      { m_string=value;  }
  datetime          GetDateTime(void)            { return(m_datetime); }
  void              SetDateTime(datetime value)  { m_datetime=value;  }
  //--- ファイル操作のメソッド
  virtual bool      Save(int file_handle);
  virtual bool      Load(int file_handle);
protected:
  virtual int       Compare(const CObject *node,int mode);
  //--- クラスインスタンス作成のメソッド
  virtual CTreeNode* CreateSample();
 };
//+------------------------------------------------------------------+
//| CMyTreeNode クラスコンストラクタ                                  |
//| 入力:なし                                                   |
//| 出力:なし                                                   |
//| メモ:なし                                                   |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
 {
//--- ユーザデータの初期化
  m_long        =0;
  m_double      =0.0;
  m_string      ="";
  m_datetime    =0;
 }
//+------------------------------------------------------------------+
//| 指定されたアルゴリズムでの他のツリーノードとの比較   |
//| 入力: node - 比較されるツリー要素                          |
//|         mode - 比較アルゴリズムの識別子              |
//| 出力:比較結果(>0、0、<0 )                         |
//| メモ:なし                                                   |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
 {
//--- ツリー構築アルゴリズムが 1 つだけであるため、パラメータモードが無視される
  int res=0;
//--- 明示的な型キャスト
  CMyTreeNode *n=node;
  res=(int)(m_long-n.m_long);
//---
  return(res);
 }
//+------------------------------------------------------------------+
//| 新しいクラスインスタンスの作成                               |
//| 入力:なし                                                   |
//| 出力:CMyTreeNodeクラスの新しいインスタンスへのポインタ         |
//| メモ:なし                                                   |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
 {
  CMyTreeNode *result=new CMyTreeNode;
//---
  return(result);
 }
//+------------------------------------------------------------------+
//| ツリーノードデータをファイルに書き込みます。                                 |
//| 入力:file_handle - 既に書き込みのために開かれたファイルのハンドル   |
//| 出力:成功の場合は true、それ以外の場合は false                            |
//| メモ:なし                                                   |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
 {
  uint i=0,len;
//--- チェック
  if(file_handle<0) return(false);
//--- ユーザデータの書き込み
//--- long 型のカスタム変数の書き込み
  if(FileWriteLong(file_handle,m_long)!=sizeof(long))         return(false);
//--- double 型のカスタム変数の書き込み
  if(FileWriteDouble(file_handle,m_double)!=sizeof(double))   return(false);
//--- string 型のカスタム変数の書き込み
  len=StringLen(m_string);
//--- 文字列の長さを書き込む
  if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE)   return(false);
//--- 文字列を書き込む
  if(len!=0 && FileWriteString(file_handle,m_string,len)!=len) return(false);
//--- datetime 型のカスタム変数の書き込み
  if(FileWriteLong(file_handle,m_datetime)!=sizeof(long))     return(false);
//---
  return(true);
 }
//+------------------------------------------------------------------+
//| ファイルからツリーノードデータを読み込む                                |
//| 入力: file_handle - 既に読み込みのために開かれたファイルのハンドル   |
//| 出力:成功の場合は true、それ以外の場合は false                            |
//| メモ:なし                                                   |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
 {
  uint i=0,len;
//--- チェック
  if(file_handle<0) return(false);
//--- 読み込み
  if(FileIsEnding(file_handle)) return(false);
//--- char 型のカスタム変数の読み込み
//--- long 型のカスタム変数の読み込み
  m_long=FileReadLong(file_handle);
//--- double 型のカスタム変数の読み込み
  m_double=FileReadDouble(file_handle);
//--- string 型のカスタム変数の読み込み
//--- 文字列の長さを読み込む
  len=FileReadInteger(file_handle,INT_VALUE);
//--- 文字列を読み込む
  if(len!=0) m_string=FileReadString(file_handle,len);
  else       m_string="";
//--- datetime 型のカスタム変数の読み込み
  m_datetime=FileReadLong(file_handle);
//---
  return(true);
 }