เราไปที่หัวข้อนี้เมื่อไม่นานมานี้ในชั้นเรียน EECS ของฉัน หากคุณต้องการดูรายละเอียดของเอกสารประกอบการบรรยายโปรดไปที่http://umich.edu/~eecs381/lecture/IdiomsDesPattsCresh.pdf
มีสองวิธีที่ฉันรู้ในการสร้างคลาส Singleton อย่างถูกต้อง
วิธีแรก:
ใช้มันคล้ายกับที่คุณมีในตัวอย่าง สำหรับการทำลาย "Singletons มักจะทนต่อความยาวของการเรียกใช้โปรแกรมระบบปฏิบัติการส่วนใหญ่จะกู้คืนหน่วยความจำและทรัพยากรอื่น ๆ ส่วนใหญ่เมื่อโปรแกรมหยุดทำงานดังนั้นจึงมีข้อโต้แย้งว่า
อย่างไรก็ตามเป็นวิธีปฏิบัติที่ดีในการล้างข้อมูลเมื่อสิ้นสุดโปรแกรม ดังนั้นคุณสามารถทำเช่นนี้กับคลาส SingletonDestructor คงที่เสริมและประกาศว่าเป็นเพื่อนใน Singleton ของคุณ
class Singleton {
public:
static Singleton* get_instance();
// disable copy/move -- this is a Singleton
Singleton(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton& operator=(Singleton&&) = delete;
friend class Singleton_destroyer;
private:
Singleton(); // no one else can create one
~Singleton(); // prevent accidental deletion
static Singleton* ptr;
};
// auxiliary static object for destroying the memory of Singleton
class Singleton_destroyer {
public:
~Singleton_destroyer { delete Singleton::ptr; }
};
Singleton_destroyer จะถูกสร้างขึ้นเมื่อเริ่มต้นโปรแกรมและ "เมื่อโปรแกรมสิ้นสุดลงวัตถุโกลบอล / สแตติกทั้งหมดจะถูกทำลายโดยรหัสปิดไลบรารีของไลบรารีรันไทม์ (แทรกโดยตัวเชื่อมโยง) ดังนั้นตัวทำลายจะถูกทำลายตัวทำลายจะลบ Singleton ออก destructor."
วิธีที่สอง
สิ่งนี้เรียกว่า Meyers Singleton สร้างโดย C ++ wizard Meyers Scott เพียงกำหนด get_instance () ให้แตกต่างกัน ตอนนี้คุณสามารถกำจัดตัวแปรสมาชิกพอยน์เตอร์ได้
// public member function
static Singleton& Singleton::get_instance()
{
static Singleton s;
return s;
}
นี่เป็นระเบียบเพราะค่าที่ส่งคืนเป็นการอ้างอิงและคุณสามารถใช้.
ไวยากรณ์แทน->
การเข้าถึงตัวแปรสมาชิก
คอมไพเลอร์สร้างรหัสอัตโนมัติที่สร้างครั้งแรกผ่านการประกาศไม่ใช่หลังจากนั้นจากนั้นจึงลบวัตถุแบบสแตติกเมื่อสิ้นสุดโปรแกรม
โปรดทราบว่าด้วย Meyers Singleton คุณ "สามารถเข้าสู่สถานการณ์ที่ยากลำบากมากหากวัตถุพึ่งพาซึ่งกันและกันในเวลาที่สิ้นสุด - Singleton จะหายไปเมื่อเทียบกับวัตถุอื่น ๆ หรือไม่ แต่สำหรับแอปพลิเคชันที่เรียบง่าย