GetPointer
Hàm trả về con trỏ của đối tượng.
void* GetPointer(
any_class anyobject // đối tượng của bất kỳ lớp nào
);
2
3
Tham số
anyobject
[truyền vào] Đối tượng của bất kỳ lớp nào.
Giá trị trả về
Hàm trả về con trỏ của đối tượng.
Ghi chú
Chỉ các đối tượng lớp mới có con trỏ. Các thể hiện của cấu trúc và biến kiểu đơn giản không thể có con trỏ. Đối tượng lớp không được tạo bằng toán tử new()
, mà ví dụ như được tạo tự động trong mảng các đối tượng, vẫn có con trỏ. Nhưng con trỏ này sẽ thuộc loại tự động POINTER_AUTOMATIC
, do đó toán tử delete()
không thể áp dụng cho nó. Ngoài ra, loại con trỏ này không khác gì các con trỏ động của loại POINTER_DYNAMIC
.
Vì các biến kiểu cấu trúc và kiểu đơn giản không có con trỏ, việc áp dụng hàm GetPointer()
cho chúng là bị cấm. Việc truyền con trỏ làm tham số hàm cũng bị cấm. Trong tất cả các trường hợp này, trình biên dịch sẽ thông báo lỗi.
Việc cố gắng gọi một con trỏ không chính xác gây ra sự chấm dứt nghiêm trọng của chương trình. Do đó, hàm CheckPointer()
nên được gọi trước khi sử dụng một con trỏ. Một con trỏ có thể không chính xác trong các trường hợp sau:
Hàm này có thể được sử dụng để kiểm tra tính hợp lệ của con trỏ. Giá trị khác 0 đảm bảo rằng con trỏ có thể được sử dụng để truy cập.
Ví dụ:
//+------------------------------------------------------------------+
//| Check_GetPointer.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Lớp thực hiện phần tử danh sách |
//+------------------------------------------------------------------+
class CItem
{
int m_id;
string m_comment;
CItem* m_next;
public:
CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
~CItem() { Print("Hàm hủy của ",m_id,
(CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
"động":"không động"); }
void Initialize(int id,string comm) { m_id=id; m_comment=comm; }
void PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
int Identifier() { return(m_id); }
CItem* Next() {return(m_next); }
void Next(CItem *item) { m_next=item; }
};
//+------------------------------------------------------------------+
//| Lớp đơn giản nhất của danh sách |
//+------------------------------------------------------------------+
class CMyList
{
CItem* m_items;
public:
CMyList() { m_items=NULL; }
~CMyList() { Destroy(); }
bool InsertToBegin(CItem* item);
void Destroy();
};
//+------------------------------------------------------------------+
//| Chèn phần tử danh sách vào đầu |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
{
if(CheckPointer(item)==POINTER_INVALID) return(false);
//---
item.Next(m_items);
m_items=item;
//---
return(true);
}
//+------------------------------------------------------------------+
//| Xóa danh sách bằng cách xóa các phần tử |
//+------------------------------------------------------------------+
void CMyList::Destroy()
{
//--- con trỏ dịch vụ để làm việc trong vòng lặp
CItem* item;
//--- đi qua vòng lặp và cố gắng xóa các con trỏ động
while(CheckPointer(m_items)!=POINTER_INVALID)
{
item=m_items;
m_items=m_items.Next();
if(CheckPointer(item)==POINTER_DYNAMIC)
{
Print("Đối tượng động ",item.Identifier()," sẽ bị xóa");
delete (item);
}
else Print("Đối tượng không động ",item.Identifier()," không thể bị xóa");
}
//---
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
CMyList list;
CItem items[10];
CItem* item;
//--- tạo và thêm vào danh sách một con trỏ đối tượng động
item=new CItem;
if(item!=NULL)
{
item.Initialize(100,"động");
item.PrintMe();
list.InsertToBegin(item);
}
//--- thêm các con trỏ tự động vào danh sách
for(int i=0; i<10; i++)
{
items[i].Initialize(i,"tự động");
items[i].PrintMe();
item=GetPointer(items[i]);
if(CheckPointer(item)!=POINTER_INVALID)
list.InsertToBegin(item);
}
//--- thêm một con trỏ đối tượng động nữa vào đầu danh sách
item=new CItem;
if(item!=NULL)
{
item.Initialize(200,"động");
item.PrintMe();
list.InsertToBegin(item);
}
//--- xóa tất cả các phần tử danh sách
list.Destroy();
//--- tất cả các phần tử danh sách sẽ bị xóa sau khi script kết thúc
//--- xem tab Experts trong terminal
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
Xem thêm
Object Pointers
, Checking the Object Pointer
, Object Delete Operator delete