2014-07-11 18 views
8

Một điều phổ biến tôi thấy mình làm là làm cho "gần như mặc định" nhà xây dựng bản sao và các nhà khai thác chuyển nhượng. Đó là, tôi thấy mình trong các tình huống mà trình biên dịch cung cấp các toán tử gán và sao chép sẽ làm việc cho hầu hết các thành viên dữ liệu, nhưng có một thành viên dữ liệu cụ thể cần phải được xử lý khác nhau. Điều này có nghĩa rằng tôi phải tạo một cách rõ ràng một toán tử xây dựng/gán bản sao, bao gồm liệt kê rõ ràng tất cả các thành viên dữ liệu có ngữ nghĩa sao chép đơn giản. Điều này có thể gây khó chịu cho các lớp, nơi có một số lượng hợp lý các thành viên dữ liệu, hoặc sau này khi các biến thành viên được thêm vào nhưng không được thêm vào toán tử tạo bản sao/gán."Hầu như mặc định" constructor sao chép (& nhà điều hành chuyển nhượng) trong C + +

Có cách nào để báo cho trình biên dịch C++ rằng một nhà khai thác/khai thác bản sao được khai báo rõ ràng sẽ hoạt động giống như một trình ẩn, ngoại trừ một số mã bổ sung chạy sau đó? (Và là một cú pháp C++ 98 tương thích, hoặc không cần hỗ trợ C++ 11 hoặc C++ 14?)

+16

Triển khai trình bao bọc RAII thích hợp cho một thành viên dữ liệu đó, khi đó các hàm tạo mặc định sẽ hoạt động cho mọi thứ. –

Trả lời

8

Nếu bạn có thể cô lập việc xử lý cụ thể trong một trình bao bọc RAII thích hợp như Igor Tandetnik gợi ý: đi cho điều đó.

Nếu bạn vẫn cần xử lý cụ thể trong trình tạo bản sao và/hoặc toán tử gán (chẳng hạn như đăng ký tạo/gán đối tượng trong thùng chứa hoặc nhật ký), bạn có thể nhóm các thành viên dữ liệu có thể được sao chép mặc định một lớp học riêng biệt mà bạn sử dụng như một lớp cơ sở hoặc thành viên dữ liệu, mà bạn xử lý như composite, như sau:

struct x_base { 
    int a,b,c,d; 
    std::string name; 
}; 

struct x : x_base { 
    x(const x& other) 
     : x_base(other) 
    { 
     descr = "copied "; 
     descr += name; 
     descr += " at "; 
     descr += CurrentTimeAsString(); 
     std::cout << descr << "\n"; 
    } 
    void operator = (const x& other) 
    { 
     x_base::operator =(other); 
     descr = "assigned "; 
     descr += name; 
     descr += " at "; 
     descr += CurrentTimeAsString(); 
     std::cout << descr << "\n"; 
    } 
    std::string descr; 
}; 

Khi sau đó bạn thêm dữ liệu các thành viên mà không cần phải xử lý cụ thể, bạn có thể chỉ cần thêm chúng vào x_base .

+1

Điều này tận dụng nguyên tắc mà hàm tạo bản sao được xác định ngầm cho một lớp phi công đoàn thực hiện một bản sao thành viên của các cơ sở và thành viên của nó (Chuẩn C++, giáo phái 12.8 pt 15). Tuy nhiên, lưu ý rằng điều này có một số ràng buộc về thứ tự sao chép thành viên được thực hiện. – Christophe

Các vấn đề liên quan