Sobes.tech
Middle+

C++ da sinfning nusxalar sonini qanday cheklash mumkin?

sobes.tech AI

AIdan javob

Mövcud bir neçə üsul var, əsasları:

  1. Statik sayğac dəyişəni istifadə etmək:

    • Yaradılan nümunələrin sayını izləmək üçün int tipində 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;
    
  2. 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::vector və ya std::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;
    

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.