//+------------------------------------------------------------------+
//| 自由访问数组元素的类 |
//+------------------------------------------------------------------+
template<typename T>
class TSafeArray
{
protected:
T m_array[];
public:
//--- 默认构造函数
void TSafeArray(void){}
//--- 创建指定大小数组的构造函数
void TSafeArray(int size){ArrayResize(m_array,size);}
//--- 数组大小
int Size(void){return(ArraySize(m_array));}
//--- 改变数组大小
int Resize(int size,int reserve){return(ArrayResize(m_array,size,reserve));}
//--- 释放数组
void Erase(void){ZeroMemory(m_array);}
//--- 通过索引访问数组元素的操作符
T operator[](int index);
//--- 从数组一次性接收全部元素的赋值操作符
void operator=(const T &array[]); // T 类型数组
};
//+------------------------------------------------------------------+
//| 通过索引接收元素 |
//+------------------------------------------------------------------+
template<typename T>
T TSafeArray::operator[](int index)
{
static T invalid_value;
//---
int max=ArraySize(m_array)-1;
if(index<0 || index>=ArraySize(m_array))
{
PrintFormat("%s index %d is not in range (0-%d)!",__FUNCTION__,index,max);
return(invalid_value);
}
//---
return(m_array[index]);
}
//+------------------------------------------------------------------+
//| 分配数组 |
//+------------------------------------------------------------------+
template<typename T>
void TSafeArray::operator=(const T &array[])
{
int size=ArraySize(array);
ArrayResize(m_array,size);
//--- T 类型应该支持复制操作符
for(int i=0;i<size;i++)
m_array[i]=array[i];
//---
}
//+------------------------------------------------------------------+
//| 脚本程序起始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
int copied,size=15;
MqlRates rates[];
//--- 复制报价数组
if((copied=CopyRates(_Symbol,_Period,0,size,rates))!=size)
{
PrintFormat("CopyRates(%s,%s,0,%d) returned %d error code",
_Symbol,EnumToString(_Period),size,GetLastError());
return;
}
//--- 创建容器并插入MqlRates值数组
TSafeArray<MqlRates> safe_rates;
safe_rates=rates;
//--- 数组内索引
int index=3;
PrintFormat("Close[%d]=%G",index,safe_rates[index].close);
//--- 数组外索引
index=size;
PrintFormat("Close[%d]=%G",index,safe_rates[index].close);
}
|