Hàm (phương thức) trong cấu trúc
Sau khi nhận được kết quả từ hàm calculate
, sẽ rất mong muốn in nó ra nhật ký, nhưng hàm Print
không hoạt động với các kiểu do người dùng định nghĩa: chính chúng phải cung cấp cách để xuất thông tin.
void OnStart()
{
Settings s = {D'2021.01.01', 1000, PRICE_CLOSE, 8};
Result r = calculate(s);
// Print(r); // error: 'r' - objects are passed by reference only
// Print(&r); // error: 'r' - class type expected
}
2
3
4
5
6
7
Các bình luận cho thấy các nỗ lực gọi hàm Print
cho cấu trúc và những gì xảy ra sau đó. Lỗi đầu tiên xuất hiện do thực tế là các phiên bản của cấu trúc là các đối tượng, và các đối tượng phải được truyền vào hàm theo tham chiếu. Đồng thời, Print
đang mong đợi một giá trị (một hoặc nhiều). Việc sử dụng dấu '&' trước tên biến trong lần gọi Print
thứ hai có nghĩa là trong MQL5, một con trỏ được nhận, và nó không phải là tham chiếu như người ta có thể nghĩ. Con trỏ trong MQL5 chỉ được hỗ trợ cho các đối tượng lớp (không phải cấu trúc), do đó xuất hiện lỗi thứ hai "class type expected". Chúng ta sẽ tìm hiểu thêm về con trỏ trong chương tiếp theo (xem Lớp và giao diện).
Chúng ta có thể chỉ định trong lệnh gọi Print
tất cả các thành viên của cấu trúc một cách riêng lẻ (sử dụng toán tử giải tham chiếu), nhưng điều này khá phiền hà.
Đối với những trường hợp cần xử lý nội dung của cấu trúc theo cách đặc biệt, có thể định nghĩa các hàm bên trong cấu trúc. Cú pháp của định nghĩa không khác gì các hàm ngữ cảnh toàn cục quen thuộc, nhưng chính định nghĩa nằm bên trong khối cấu trúc.
Những hàm như vậy được gọi là phương thức. Vì chúng nằm trong ngữ cảnh của khối tương ứng, các trường của cấu trúc có thể được truy cập từ chúng mà không cần toán tử giải tham chiếu. Ví dụ, hãy viết triển khai của hàm print
trong cấu trúc Result
.
struct Result
{
...
void print()
{
Print(probability, " ", direction, " ", status);
ArrayPrint(coef);
}
};
2
3
4
5
6
7
8
9
Việc gọi một phương thức của phiên bản cấu trúc đơn giản như đọc trường của nó: cùng toán tử '.' được sử dụng.
void OnStart()
{
Settings s = {D'2021.01.01', 1000, PRICE_CLOSE, 8};
Result r = calculate(s);
r.print();
}
2
3
4
5
6
Chương về Lớp sẽ đề cập chi tiết hơn về các phương thức. !