Unique_ptr aus der verwalteten Klasse resetten



  • Hi,

    ist folgendes legal?

    #include <memory>
    #include <iostream>
    #include <deque>
    
    class Mode {
    	public:
    		static std::unique_ptr<Mode> current;
    		virtual void doSomething() = 0;
    };
    
    class B : public Mode {
    	public:
    		void doSomething() { std::cout << "Mode B " << std::endl; }
    };
    
    class A : public Mode {
    	private:
    		std::deque<char> chars;
    	public:
    		A() : chars{'a', 'b', 'c'} {}
    		void doSomething() { 
    			if(chars.empty() ) { 
                    Mode::current.reset(new B);
                    return;
                }  
    			chars.pop_front();
    		}
    };
    
    std::unique_ptr<Mode> Mode::current(new A);
    
    int main() {
    	for(unsigned i = 0; i < 5; ++i) Mode::current->doSomething();
    	std::cout << "Done" << std::endl;
    }
    


  • AFAIK ist das in Ordnung solange nach dem delete (reset) keine Member Variablen mehr "angefasst" werden. Ich würde das ähnlich sehen wie delete this.



  • Du hast nen virtuellen Destruktor in Mode vergessen! Abgesehen davon, ist das alles i.O.



  • krümelkacker schrieb:

    Du hast nen virtuellen Destruktor in Mode vergessen! Abgesehen davon, ist das alles i.O.

    Stimmt, danke. 🙂


Anmelden zum Antworten