Menu
CoddyTech

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.

challenge icon

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 struct Person với name (mảng ký tự có 50 ký tự) và age (số nguyên). Sau đó, định nghĩa một struct Student nhúng Person làm thành viên đầu tiên và thêm trường grade (số nguyên biểu thị điểm số). Khai báo hai hàm: set_person_age nhận một Student* và một giá trị tuổi mới, còn print_student nhận một Student* và hiển thị toàn bộ thông tin.
  • student.c: Cài đặt cả hai hàm. Hàm set_person_age cần sửa đổi tuổi bên trong struct Person nhú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àm print_student cầ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ến Student và khởi tạo tất cả các trường của nó. Sau đó, dùng set_person_age để cập nhật tuổi của người được nhúng, rồi gọi print_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: 85

Trong đó, 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;
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C online