Khởi Tạo Đối Tượng Sau Khi Tích Hợp GC Trong C++ - nói dối e blog

Khởi Tạo Đối Tượng Sau Khi Tích Hợp GC Trong C++

Những ngày gần đây, công việc ban ngày chủ yếu là sắp xếp lịch phỏng vấn, thật ra cũng hơi mệt. Tối về thì làm vài đoạn code giải trí, lâu lắm rồi không động đến C++, cảm giác có chút bỡ ngỡ. Coi như đây là cách thư giãn vậy.

Công việc chính thực ra là xây dựng một lớp trung gian C++ dựa trên thư viện C, tương tự như việc tạo lớp trung gian Lua trên nền thư viện C. Dạo trước tích hợp thêm cơ chế thu gom rác (GC), phát hiện ra vài cách dùng thú vị.

Chẳng hạn như việc khởi tạo đối tượng. Trong API C, nếu tạo đối tượng thất bại sẽ trả về con trỏ null. Nhưng với C++ thì khác, toán tử new không nên trả về null. Sách vở thường khuyên nên ném ngoại lệ trong hàm khởi tạo. Tuy nhiên mình lại không muốn thêm cơ chế ngoại lệ vào, xử lý sao đây?

Phương pháp đơn giản là để hàm khởi tạo của lớp bọc C++ không làm gì cả. À nhân tiện, mình từng nghe Mike Burrows từ Google chia sẻ rằng “những cấu trúc C++ phổ biến có thể gây hại cho tính trừu tượng”.

Sau đó thêm vào hàm init để khởi tạo đối tượng, trả về this nếu thành công hoặc NULL nếu thất bại. Trước khi có GC, mình phải viết thế này:

1
2
3
4
5
A *a = new A;
if (!a->init()) {
 delete a;
 a = NULL;
}

Còn khi đã có GC thì gọn ghẽ hơn nhiều:

1
A *a = (new A)->init();

Hehe, có GC quả thực tiện lợi thật. Chỉ tiếc là độ ưu tiên của toán tử new khiến mình hơi khó chịu. P/s: Mình biết là ngay cả khi không có GC, vẫn có thể dùng các kỹ thuật template hiện đại để đạt hiệu quả tương tự. Cách code lúc ấy trông cũng “sang” hơn nhiều. Nhưng có lẽ mình đang dần trở nên cổ lỗ sĩ, viết C++ ngày càng mang phong cách C. So với cái nhiệt huyết ngày xưa dành cho C++ thì giờ chẳng còn thấy đâu nữa.

0%