Middle+
C++ da sinfning nusxalar sonini qanday cheklash mumkin?
sobes.tech AI
AIdan javob
Mövcud bir neçə üsul var, əsasları:
-
Statik sayğac dəyişəni istifadə etmək:
- Yaradılan nümunələrin sayını izləmək üçün
inttipində statik dəyişən yaradın. - Konstruktor daxilində sayğacı artırın.
- Destruktor daxilində sayğacı azaldın.
- Konstruktor daxilində sayğacın dəyərini yoxlayın və əgər limit aşılırsa, istisna atın və ya digər tədbirlər görün.
- Konstruktoru özəl və ya qorunan edin və nümunələri statik fabrik funksiyası vasitəsilə yaradın, bu yoxlamanı həyata keçirir.
- Kopyalama və köçürməni qadağan edin.
#include <iostream> #include <stdexcept> class LimitedInstances { private: static int instance_count; static const int max_instances = 3; LimitedInstances() { if (instance_count >= max_instances) { throw std::runtime_error("Maksimum nümunə sayı çatdı."); } instance_count++; std::cout << "Nümunə yaradıldı. Ümumilikdə: " << instance_count << std::endl; } // Kopyalama və köçürməni qadağan et LimitedInstances(const LimitedInstances&) = delete; LimitedInstances& operator=(const LimitedInstances&) = delete; LimitedInstances(LimitedInstances&&) = delete; LimitedInstances& operator=(LimitedInstances&&) = delete; public: ~LimitedInstances() { instance_count--; std::cout << "Nümunə məhv edildi. Ümumilikdə: " << instance_count << std::endl; } static LimitedInstances* create_instance() { return new LimitedInstances(); } }; int LimitedInstances::instance_count = 0; - Yaradılan nümunələrin sayını izləmək üçün
-
Singleton nümunəsindən istifadə və dəyişiklik:
- Adətən, Singleton bir nümunəni təmin edir. Nümunələrin sayını məhdudlaşdırmaq üçün, onu dəyişdirə və idarə edə bilərsiniz, statik funksiya vasitəsilə giriş və yaradılan obyektləri xüsusi statik konteynerdə (məsələn,
std::vectorvə yastd::list) izləyərək.
#include <iostream> #include <vector> #include <stdexcept> class NLimitedInstances { private: static std::vector<NLimitedInstances*> instances; static const int max_instances = 2; NLimitedInstances() { std::cout << "NLimitedInstances yaradıldı." << std::endl; } // Kopyalama və köçürməni qadağan et NLimitedInstances(const NLimitedInstances&) = delete; NLimitedInstances& operator=(const NLimitedInstances&) = delete; NLimitedInstances(NLimitedInstances&&) = delete; NLimitedInstances& operator=(NLimitedInstances&&) = delete; public: static NLimitedInstances* get_instance() { if (instances.size() >= max_instances) { throw std::runtime_error("NLimitedInstances maksimum sayıya çatdı."); } NLimitedInstances* new_instance = new NLimitedInstances(); instances.push_back(new_instance); return new_instance; } static void destroy_instance(NLimitedInstances* instance) { // İstifadəçi və ya başqa mexanizm ilə nümunəni tap və sil for (auto it = instances.begin(); it != instances.end(); ++it) { if (*it == instance) { delete *it; instances.erase(it); std::cout << "NLimitedInstances silindi." << std::endl; return; } } } ~NLimitedInstances() = default; // və ya təmizləmə loqikasını əlavə et }; std::vector<NLimitedInstances*> NLimitedInstances::instances; - Adətən, Singleton bir nümunəni təmin edir. Nümunələrin sayını məhdudlaşdırmaq üçün, onu dəyişdirə və idarə edə bilərsiniz, statik funksiya vasitəsilə giriş və yaradılan obyektləri xüsusi statik konteynerdə (məsələn,
Hər iki yanaşma resursların diqqətlə idarə olunmasını tələb edir, xüsusən new istifadə edilərkən. Dəyişikliklə Singleton nümunəsi daha mürəkkəb ola bilər, xüsusən də onların həyat dövrü proqramın sonu ilə üst-üstə düşmürsə.
Yol seçimi, xüsusi tələblər və sistemin mürəkkəbliyindən asılıdır. Statik sayğac ilə yanaşma ümumiyyətlə daha sadədir və həyata keçirilməsi asandır.