[Buổi 26][Vòng đời & operator][ADV] Bài 1: Buffer sở hữu sâu với Rule of Three


LÀM BÀI

Points: 100
Time limit: 2.0s
Memory limit: 256M

Author:
Problem types
Allowed languages
C++

Buffer sở hữu sâu với Rule of Three

Bối cảnh

Xây class IntBuffer sở hữu một mảng động long long. Object hỗ trợ constructor theo size, destructor, copy constructor và copy assignment — tức Rule of Three. Hệ thống tạo buffer A từ input, copy-construct B=A, sau đó sửa A; tiếp theo default/size-construct C rồi C=B, sau đó sửa B. Cuối cùng in checksum (tổng phần tử) của A,B,C và giá trị tại một index kiểm tra.

Nếu copy chỉ sao chép pointer, việc sửa A sẽ làm B thay đổi và destructor có thể double-delete. Bài Advanced nhằm buộc học viên thực hiện deep copy đúng và xử lý self-assignment trong operator=. Không dùng vector làm storage chính.

Ở B26, constructor/operator/destructor phải được xem như một phần của semantics object chứ không chỉ là cú pháp. Constructor nên đưa object về representation chuẩn ngay từ đầu; operator đọc các object hợp lệ và trả kết quả có cùng invariant; destructor chỉ giải phóng tài nguyên thuộc ownership của chính object.

Ở B26, constructor/operator/destructor phải được xem như một phần của semantics object chứ không chỉ là cú pháp. Constructor nên đưa object về representation chuẩn ngay từ đầu; operator đọc các object hợp lệ và trả kết quả có cùng invariant; destructor chỉ giải phóng tài nguyên thuộc ownership của chính object.

Yêu cầu

  1. Class IntBuffer sở hữu long long* data, int n.
  2. Destructor delete[].
  3. Copy constructor deep copy.
  4. Copy assignment deep copy + self-assignment safe.
  5. Methods set/get/sum.
  6. Thực hiện scenario theo input và in kết quả.

Yêu cầu tổ chức code

Storage chính bắt buộc raw pointer; không dùng vector.

Input

Dòng 1 n; dòng 2 n số; dòng 3 idx newA newB.

Output

Một dòng sumA sumB sumC getA getB getC tại idx.

Ràng buộc

1≤n≤5000, idx hợp lệ.

Ví dụ 1

Input

3
1 2 3
1 20 200

Output

24 204 6 20 200 2

Giải thích

A ban đầu [1,2,3], B deep-copy cùng dữ liệu. Sửa A index1 thành20 tạo A sum24 nhưng B vẫn sum6. C=B nên C sum6. Sửa B index1 thành200 làm B sum204 nhưng C vẫn6. Giá trị tại idx là A20, B200, C2; output 24 204 6 20 200 2.

Mẫu này đồng thời kiểm tra invariant mà constructor/operator phải giữ. Kết quả không chỉ đúng về giá trị cuối mà còn phải được biểu diễn ở dạng canonical của class; các object nguồn vẫn giữ state riêng nếu phép toán được thiết kế theo value semantics.

Ví dụ 2

Input

1
5
0 7 9

Output

7 9 5 7 9 5

Giải thích

A=[5], B copy [5]. Sửa A thành7; C copy từ B vẫn5; sửa B thành9. Sums 7,9,5 và get tương ứng 7,9,5, chứng minh ba vùng nhớ độc lập.

Mẫu này đồng thời kiểm tra invariant mà constructor/operator phải giữ. Kết quả không chỉ đúng về giá trị cuối mà còn phải được biểu diễn ở dạng canonical của class; các object nguồn vẫn giữ state riêng nếu phép toán được thiết kế theo value semantics.

Thông tin học tập

  • Module: M07
  • Buổi: B26
  • Loại bài: ADVANCED
  • Độ khó: Hard
  • Concepts: class, raw pointer ownership, constructor, destructor, copy constructor, copy assignment, deep copy
  • Giới hạn kiến thức: B01-B26
  • Time limit: 2 second(s)
  • Memory limit: 256 MB
  • Point: 100

Comments

There are no comments at the moment.

Zalo