หากคุณไม่คำนึงถึงการสืบทอดหลาย ๆ อย่าง (มันก็ไม่เลวเลย) คุณสามารถเขียนคลาสแบบง่ายด้วยตัวสร้างการคัดลอกส่วนตัวและตัวดำเนินการที่ได้รับมอบหมายและเพิ่มคลาสย่อยด้วย:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
สำหรับ GCC จะให้ข้อความแสดงข้อผิดพลาดต่อไปนี้:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
ฉันไม่แน่ใจว่านี่จะทำงานในคอมไพเลอร์ทุกครั้งอย่างไร มีคำถามที่เกี่ยวข้องแต่ยังไม่มีคำตอบ
UPD:
ใน C ++ 11 คุณสามารถเขียนNonAssignable
คลาสดังนี้:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
delete
สมาชิกป้องกันคำหลักจากการเริ่มต้นสร้างเพื่อให้พวกเขาไม่สามารถใช้ต่อไปในสมาชิกเริ่มต้นสร้างคลาสที่ได้รับของ การพยายามกำหนดให้ข้อผิดพลาดต่อไปนี้ใน 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:
UPD:
Boost มีคลาสสำหรับวัตถุประสงค์เดียวกันอยู่แล้วฉันคิดว่ามันใช้งานได้ในลักษณะเดียวกัน คลาสถูกเรียกใช้boost::noncopyable
และมีไว้เพื่อใช้ดังต่อไปนี้:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
ฉันขอแนะนำให้ติดกับโซลูชันของ Boost หากนโยบายโครงการของคุณอนุญาต ดูboost::noncopyable
คำถามที่เกี่ยวข้องอีกข้อหนึ่งสำหรับข้อมูลเพิ่มเติม