Phương thức hỗ trợ
Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 10 trên 61.
Đến giờ, chúng ta đã thấy các hàm sửa đổi dữ liệu struct (như player_take_damage) và các hàm chỉ hiển thị dữ liệu. Nhưng còn một loại hàm quan trọng khác: các hàm tính toán giá trị suy ra từ các thành viên của struct mà không thay đổi gì.
Xét một struct Rectangle lưu chiều rộng và chiều cao. Diện tích không được lưu lại mà được tính khi cần:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
Đây là các phương thức hỗ trợ. Chúng lấy dữ liệu hiện có của struct và tạo ra một giá trị mới. Lưu ý rằng chúng dùng con trỏ const vì chỉ đọc, không ghi. Kết quả tính được sẽ được trả về thay vì lưu trong struct.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Mẫu này giúp các struct gọn nhẹ: chỉ lưu dữ liệu thiết yếu, còn mọi thứ khác thì tính khi cần. Mẫu này cũng đảm bảo các giá trị suy ra luôn nhất quán với trạng thái hiện tại.
Thử thách
DễHãy xây dựng một module Circle để tính các giá trị dẫn xuất từ dữ liệu đã lưu. Bạn sẽ luyện viết các phương thức hỗ trợ: những hàm tính kết quả từ các thành viên của struct mà không sửa đổi chúng.
Bạn sẽ tạo ba tệp:
circle.h: Khai báo một structCirclecó một thành viêndouble radius. Đồng thời khai báo hai phương thức hỗ trợ:circle_area: nhận một con trỏconstđến Circle và trả về diện tíchcircle_circumference: nhận một con trỏconstđến Circle và trả về chu vi
CIRCLE_H.circle.c: Triển khai cả hai phương thức hỗ trợ. Khi tính toán, dùng3.14159làm giá trị của pi. Công thức tính diện tích làpi * radius * radius, còn công thức tính chu vi là2 * pi * radius. Cả hai hàm chỉ nên đọc radius, không bao giờ sửa đổi giá trị này.main.c: Tạo một Circle và dùng các phương thức hỗ trợ để tính, rồi hiển thị các thuộc tính của nó.
Bạn sẽ nhận một đầu vào: bán kính của hình tròn (dưới dạng double).
Trong tệp main, khởi tạo một Circle với bán kính đã cho, sau đó dùng các phương thức hỗ trợ để tính và in ra diện tích cùng chu vi.
In kết quả theo định dạng sau:
Area: {area}
Circumference: {circumference}Dùng %.2f cho cả hai giá trị để hiển thị hai chữ số thập phân.
Ví dụ, với bán kính 5.0, kết quả sẽ là:
Area: 78.54
Circumference: 31.42Tự làm thử
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Tạo một struct Circle với bán kính đã cho
// TODO: Dùng các phương thức hỗ trợ circle_area và circle_circumference
// để tính toán và in ra kết quả
// Định dạng in ra:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
return 0;
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online