Move CTOR?



  • Guten Morgen Gemeinde,

    ich habe mal wieder eine Frage. Wenn ich eine Vectorklasse von vector ableite, wie muß dann der Move Konstruktor aussehen?
    Ist das folgende korrekt?

    template<class T>
    class MyVector : public vector<T>
    {
      MyVector(MyVector&& other)
      {
        this = std::move(other);
      }
    };
    

    Wenn ich in MyVector mit T* ptr; und new/delete arbeiten würde wäre es einfach, was ist aber mit dem Container als Basisklasse?

    Gruß Andreas Georg



  • 1. std::vector<T> ist nicht als Basisklasse geeignet.
    2.

    MyVector(MyVector&& other)
     : std::vector<T>{std::forward<MyVector>(other)} {}
    


  • Danke Dir.

    Zu ist nicht geeignet, da hast Du sicherlich recht.

    Aber mir ist nichts besseres eingefallen um meinen Vektor Addition, Multiplikation usw. beizubringen.

    Gruß Andreas Georg



  • fwbp34 schrieb:

    Aber mir ist nichts besseres eingefallen um meinen Vektor Addition, Multiplikation usw. beizubringen.

    dazu gibt es bessere möglichkeiten:

    // Iterator-Pattern
    template<typename InputIteratorType>
    void Add(InputIteratorType LhsBegin, InputIteratorType LhsEnd, InputIteratorType RhsBegin)
    {
    	while(LhsBegin != LhsEnd)
    	{
    		*LhsBegin++ += *RhsBegin++;
    	}
    }
    
    // Operator-Überladung
    template<typename T, typename LhsAllocator, typename RhsAllocator>
    std::vector<T, LhsAllocator>& operator+= (std::vector<T, LhsAllocator>& Lhs, std::vector<T, RhsAllocator> const& Rhs)
    {
    	// Range prüfen, evtl. throwen
    	for(typename std::vector<T, LhsAllocator>::size_type i = 0; i < Lhs.size(); ++i)
    	{
    		Lhs[i] += Rhs[i];
    	}
    	// Edit: Hier natürlich noch ein return-Statement, das hab ich Schussel natürlich vergessen:
    	return Lhs;
    }
    


  • Wenn du kleinere vectoren für Spiele willst bau das lieber auf std::array auf (als Member, nicht erben! Oo Oder vielleicht noch besser, überlade einfach die Operatoren für std::array<float, N>.) und nimm die Größe als Template-Parameter. Dafür jedes mal neu Speicher anzufordern macht weder Sinn noch ist es (cache) effizient. Zudem ist std::forward hier nicht angebracht, nimm std::move. std::forward ist nur für einen Spezialfall in der Sprache gedacht bei dem du noch nicht weist ob du eine rvalue-reference oder eine lvalue-reference vorliegen hast.

    MyVector(MyVector&& other)
        : std::vector<T>{std::move(other)}
    {}
    

Anmelden zum Antworten