Nếu bạn không bận tâm đến nhiều kế thừa (rốt cuộc thì nó không tệ lắm), bạn có thể viết lớp đơn giản với hàm tạo sao chép riêng và toán tử gán và thêm lớp con nó:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
Đối với GCC, thông báo lỗi sau:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
Tôi không chắc chắn cho điều này để làm việc trong mọi trình biên dịch, mặc dù. Có một câu hỏi liên quan , nhưng chưa có câu trả lời.
CẬP NHẬT:
Trong C ++ 11, bạn cũng có thể viết NonAssignable
lớp như sau:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
Các delete
thành viên ngăn chặn từ khóa khỏi bị mặc định-xây dựng, vì vậy họ không thể tiếp tục sử dụng trong các thành viên mặc định-xây dựng một lớp dẫn xuất của. Cố gắng gán cho lỗi sau trong GCC:
test.cpp: error: use of deleted function
‘SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)’
test.cpp: note: ‘SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)’
is implicitly deleted because the default definition would
be ill-formed:
CẬP NHẬT:
Boost đã có một lớp chỉ cho cùng một mục đích, tôi đoán nó thậm chí còn được thực hiện theo cách tương tự. Lớp được gọi boost::noncopyable
và có nghĩa là được sử dụng như sau:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
Tôi khuyên bạn nên bám sát giải pháp của Boost nếu chính sách dự án của bạn cho phép. Xem thêm một boost::noncopyable
câu hỏi liên quan khác để biết thêm thông tin.