Problem mit Singleton: "Kein Zugriff auf private Member, dessen Deklaration in der ...-Klasse erfolgte"



  • Baut man eigentlich bei einem Singleton einen Destruktor ein?, oder benutzt man hier nur eine Destroy / Delete-Methode?

    Destruktor und Destroy sind verschiedene Sachen. Destroy soll das statische Objekt zerstören (mit delete), der Destruktor kümmert sich darum, dass beim Zerstören auch brav alle Member zerstört werden und der Speicher bereinigt wird.

    Du brauchst also auch bei einem Singleton einen Destruktor, wenn du z.B. dynamisch alloziierte Member hast, oder sonst was aufgeräumt werden muss.

    Wie müsste ich eine Singleton-Klasse aufbauen, die mit einem auto_ptr funktioniert?

    Das brauchst du eigentlich auch nicht. Ich hab oben schon den "Meyer Singleton" erwähnt:

    #include <vector>
    #include <iostream>
    
    struct Item {
        Item(int val)
         : value(val)
        {}
        int value;
    };
    
    class Manager {
        Manager() { std::cout << "Konstruktor" << std::endl; }
        ~Manager() { std::cout << "Destruktor" << std::endl; }
        Manager(const Manager&);
        Manager& operator=(const Manager&);
    
        std::vector<Item> items;
    
    public:
        static Manager& get() {
            static Manager m;
            return m;
        }
    
        void manage(const Item& i) {
            items.push_back(i);
        }
    
        const std::vector<Item>& managedItems() const {
            return items;
        }
    };
    
    int main() {
        Manager::get().manage(Item(10));
        Manager::get().manage(Item(20));
    
        const std::vector<Item>& items = Manager::get().managedItems();
        for(size_t i=0; i<items.size(); ++i)
            std::cout << items[i].value << " ";
        std::cout << std::endl;
    }
    

    Schau dir die get()-Funktion an. Auch den Destruktor kannst du private machen, damit niemand auf dumme Gedanken kommt :p



  • Ok, vielen Dank an alle die geantwortet haben, ich werde das in Zukunft beherzigen.

    Alle meine Fragen sind jetzt beantwortet ....

    CLOSED


Anmelden zum Antworten