1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class Matrice
{
public:
Matrice(int ligne, int colonne):lignes_(ligne),colonnes_(colonne),tab_(new double[ligne*colonne]){}
~Matrice(){delete tab_;}
// j'ai fourni une implémentation particulière au destructeur, je dois
// donc fournir une implémentation particulière au constructeur
// par copie et à l'opérateur d'affectation
Matrice(Matrice const & rhs):lignes_(rhs.lignes),colonnes_(rhs.colonnes), tab_(new double rhs.lignes_*rhs.colonnes_)
{
memcpy(tab_,rhs.tab_,lignes_*colones_ * sizeof(double));
}
Matrice & operator = (Matrice const & rhs)
{
Matrice temp(rhs); // crée une copie de la matrice à affecter
swap(temp); //interverti les membres de la copie et de l'objet courent
return *this;
} //temp est détruit ici, le tableau alloué dynamiquement d'origine est bien libéré
/* l'accès "en lecture seule" à un élément donné */
double itemAt(int linge, int colonne) const
{
return tab_[ligne * colonnes_ + colonne];
}
/* l'accès "en écriture" à un élément donné */
double& itemAt(int linge, int colonne)
{
return tab_[ligne * colonnes_ + colonne];
}
/* et parce que ca peut etre utile, l'opérateur de flux de sortie,
et la possibilité de récupérer le nombre de lignes et de colonnes
*/
std::ostream & operator <<(ostream & os)
{
for(int i = 0;i<lignes_;++i)
{
for(int j = 0;j<colonnes_;++j)
{
os<<itemAt(i, j)<<" ";
}
os<<std::endl;
}
return os;
}
int lignes() const{return linges_;}
int colonnes() const{return colonnes_;}
private:
int linges_;
int colonnes_;
double tab_;
void swap(Matrice & other) // la "partie magique" de l'opérateur d'affectation :D
{
std::swap(lignes_, other.lignes_);
std::swap(colonnes_,other.colonnes_);
std::swap(tab_,other.tab_);
}
}; |