J'ai lu le livre "The C++ programing language 4th edition" de Bjarne Stroustrup (le créateur de c++) et j'ai appris à connaître les constructeurs et les affectations de déplacement.
Dans le livre de la classe vector (voir 1 pour l'en-tête ci-dessous), il montre comment implémenter le constructeur de déplacement (voir 2 ci-dessous) et dit que l'affectation de déplacement est implémentée de manière similaire, mais ne montre pas comment. J'ai moi-même implémenté l'affectation de déplacement (voir 3 ci-dessous) et tout semble fonctionner correctement, mais je ne suis pas sûr de l'avoir fait correctement.
Je n'obtiens aucune erreur et j'ai regardé de nombreux exemples mais je ne peux pas confirmer que c'est correct pour ma classe spécifique. Quelqu'un d'expérimenté en C++ peut-il regarder mon code et me dire s'il est correct ?
EDIT : Veuillez également consulter le point 4 pour les constructeurs et les destructeurs.
Merci pour votre temps.
P.S. : Tous les conseils ou modifications utiles sont les bienvenus.
1) Fichier d'en-tête de classe :
#ifndef VECTOR_H
#define VECTOR_H
#include <cstdlib>
#include <iostream>
#include <stdexcept>
using namespace std;
template<typename T>
class Vector {
public:
// constructors
Vector(int s);
Vector(std::initializer_list<T>);
// destructor
~Vector();
// copy constructor and copy assignment
Vector(Vector&);
Vector<T>& operator=(Vector&);
// move constructor and move assignment
Vector(Vector&&);
Vector<T>& operator=(Vector&&);
// operators
T& operator[](int);
const T& operator[](int) const; // the second const means that this function cannot change the state of the class
// we define operator[] the second time for vectors containing constant members;
// accessors
int getSize();
private:
int size;
T* elements;
};
#endif /* VECTOR_H */
2) Constructeur de mouvement (implémenté de la même manière que le livre) :
// move constructor
template<typename T>
Vector<T>::Vector(Vector&& moveme) : size{moveme.size}, elements{moveme.elements}
{
moveme.elements = nullptr;
moveme.size = 0;
}
3) Déplacement de l'affectation (pas sûr que ce soit correct) :
// move assignment
template<typename T>
Vector<T>& Vector<T>::operator=(Vector&& moveme)
{
delete[] elements; // delete old values
elements = moveme.elements;
size = moveme.size;
moveme.elements = nullptr;
moveme.size = 0;
return *this;
}
4) Constructeurs et destructeurs :
#include <array>
#include "Vector.h"
// constructors
template<typename T>
Vector<T>::Vector(int s) {
if(s<0) throw length_error{"Vector::Vector(int s)"};
// TODO: use Negative_size{} after learning how to write custom exceptions
this->size = s;
this->elements = new T[s];
}
template<typename T>
Vector<T>::Vector(std::initializer_list<T> list) : size(list.size()),
elements(new T[list.size()])
{
copy(list.begin(), list.end(), elements);
}
// destructor
template<typename T>
Vector<T>::~Vector()
{
delete[] this->elements;
}