C2280 Unique Pointer



  • Mein reduzierter Klassen Header:

    #include "Game.h"
    
    class MenuManager
    {
    private:
    	class menu_base //Kein struct, um später noch Funktionen nachrüsten zu können
    	{
    	public:
    		menu_base();
    		~menu_base();
    		std::vector<std::unique_ptr<ButtonRectangle>> m_buttons;
    		std::vector<std::unique_ptr<SlideBar>> m_sliders;
    	};
    
    public:
    	MenuManager();
    	~MenuManager();
    
        void create(Game &game);
    
    private:
    
    	std::vector<MenuManager::menu_base> m_Menus;
    };
    

    Sobald ich versuche in der cpp ein Objekt in m_Menus hinzuzufügen, erhalte ich den Error: C2280 'std::unique_ptr<SlideBar,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function

    Hier der Aufruf:

    void MenuManager::create(Game &game)
    {
    	MenuManager::menu_base item;
    	m_Menus.push_back(item); //Error C2280
    }
    

    Ich schätze ich habe entweder Vectoren oder UniquePointer falsch benutzt, komme aber nicht dahinter was ich falsch gemacht habe.



  • Du hast 2 Probleme:

    1. Du kannst einen unique_ptr nicht kopieren. Genau das passiert aber, wenn du ein m_Menus.push_back(item); machst - denn dann hättest du ja eine Kopie im Vector und eine weiter in item. Also m_Menus.push_back(std::move(item)); (und danach item nicht mehr benutzen)

    2. du definierst den Konstruktor menu_base(); - war da nicht was mit "rule of five"? 😉 Also entweder weglassen (sofern möglich) oder noch menu_base(menu_base&&) = default; dazupacken.


  • Mod

    Hier legst du ein MenuManager::menu_base Objekt an, mit allen seinen unique Pointern:

    MenuManager::menu_base item;
    

    Und hier machst du eine Kopie davon, die in dem vector landen soll:

    m_Menus.push_back(item);
    

    Eine Kopie mit all den unique_ptr, die in dem Objekt enthalten sind. Kopien, von unique_ptrn. Fällt dir auf, warum das nicht gehen kann?

    Daher werden unique_ptr (und Objekte, die solche enthalten) normalerweise gemoved. So sollte es funktionieren (ungetestet auf andere mögliche Fehler):

    m_Menus.push_back(std::move(item));
    

    Danach ist es natürlich tabu, die Variable item noch einmal anzufassen.

    Ist das eigentlich normal, dass du einfach so einen eigenen Destruktor deklarierst, aber nicht die anderen Funktionen, die mit selbstdefinierten Destruktoren assoziiert werden? IRgendwas stimmt doch da nicht. Entweder brauchst du keine eigenen Destruktor, oder die anderen Funktionen fehlen. Steht bei dir denn überhaupt etwas im Destruktor? unique_ptr machst schließlich, dass man keinen eigenen Destruktor brauchen sollte.

    class und struct sind funktional identisch, der einzige Unterschied ist die Defaultsichtbarkeit.


Log in to reply