Truy cập thành viên lớp cha
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 30 trên 61.
Giờ bạn đã hiểu cách nhúng struct và quy tắc thành viên đầu tiên, hãy tập trung vào phần thực hành: cách đọc và sửa đổi dữ liệu của struct cha được nhúng bên trong một hàm.
Khi một hàm (function) nhận một cấu trúc Child (hoặc con trỏ đến cấu trúc đó), bạn cần truy cập các thành viên của cấu trúc cha thông qua cấu trúc được nhúng bên trong. Cú pháp tùy thuộc vào việc bạn đang làm việc với một giá trị hay một con trỏ.
typedef struct {
int id;
int score;
} Parent;
typedef struct {
Parent parent;
char grade;
} Child;Khi có con trỏ trỏ đến Child, hãy dùng toán tử mũi tên để truy cập lớp cha, rồi dùng dấu chấm để truy cập các thành viên của nó:
void update_score(Child* c, int new_score) {
c->parent.score = new_score; // Dấu mũi tên rồi đến dấu chấm
}
void print_info(Child* c) {
printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}Với một giá trị (được truyền bằng cách sao chép), hãy dùng dấu chấm xuyên suốt:
void show_id(Child c) {
printf("ID: %d\n", c.parent.id); // Dấu chấm rồi lại dấu chấm
}Mẫu truy cập nối chuỗi này, child->parent.member hoặc child.parent.member, là cách bạn tương tác với dữ liệu kế thừa trong mô hình kết hợp của C. Cách này hơi dài dòng hơn kế thừa thực sự, nhưng thể hiện rõ ràng mối quan hệ giữa các kiểu dữ liệu.
Thử thách
DễHãy xây dựng một hệ thống chấm điểm cho học sinh để minh họa cách truy cập và sửa đổi dữ liệu bên trong một struct nhúng. Bạn sẽ tạo một cấu trúc phân cấp, trong đó Student chứa một Person nhúng, sau đó viết các hàm làm việc với dữ liệu của cấu trúc cha thông qua cấu trúc con.
Bạn sẽ sắp xếp code trong ba tệp:
student.h: Định nghĩa cấu trúc phân cấp của bạn bằng các include guard. Tạo một structPersonvớiname(mảng ký tự có 50 ký tự) vàage(số nguyên). Sau đó, định nghĩa một structStudentnhúngPersonlàm thành viên đầu tiên và thêm trườnggrade(số nguyên biểu thị điểm số). Khai báo hai hàm:set_person_agenhận mộtStudent*và một giá trị tuổi mới, cònprint_studentnhận mộtStudent*và hiển thị toàn bộ thông tin.student.c: Cài đặt cả hai hàm. Hàmset_person_agecần sửa đổi tuổi bên trong structPersonnhúng. Đây là phần bạn sẽ thực hành cú pháp mũi tên rồi dấu chấm (s->person.age). Hàmprint_studentcần truy cập và hiển thị tất cả các trường của cả người được nhúng lẫn học sinh.main.c: Tạo một biếnStudentvà khởi tạo tất cả các trường của nó. Sau đó, dùngset_person_ageđể cập nhật tuổi của người được nhúng, rồi gọiprint_studentđể hiển thị kết quả.
Bạn sẽ nhận bốn đầu vào: tên của học sinh (một chuỗi), tuổi ban đầu của bạn ấy (một số nguyên), điểm số (một số nguyên) và tuổi mới (một số nguyên để cập nhật thông qua hàm của bạn).
Trong tệp main, hãy tạo học sinh với các giá trị ban đầu, sau đó gọi set_person_age để đổi tuổi thành giá trị mới, cuối cùng gọi print_student để hiển thị thông tin đã cập nhật.
Đầu ra của bạn sẽ trông như sau:
Name: Emma
Age: 21
Grade: 85Trong đó, Emma là tên, 21 là tuổi đã cập nhật (không phải tuổi ban đầu), còn 85 là điểm số. Bài học chính ở đây là cách truy cập struct nhúng để đọc và ghi các thành viên của cấu trúc cha.
Tự làm thử
#include <stdio.h>
#include <string.h>
#include "student.h"
int main() {
char name[50];
int initial_age, grade, new_age;
// Đọc dữ liệu đầu vào
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Xóa ký tự xuống dòng
scanf("%d", &initial_age);
scanf("%d", &grade);
scanf("%d", &new_age);
// TODO: Tạo một biến Student
// TODO: Khởi tạo tất cả các trường của sinh viên
// - Dùng strcpy để sao chép name vào tên của người được nhúng
// - Đặt tuổi của người được nhúng thành initial_age
// - Đặt điểm của sinh viên
// TODO: Gọi set_person_age để cập nhật tuổi thành new_age
// TODO: Gọi print_student để hiển thị kết quả
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