Help!!!

scyrille Messages postés 2 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 25 février 2005 - 24 févr. 2005 à 16:30
scyrille Messages postés 2 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 25 février 2005 - 25 févr. 2005 à 11:19
Bonjour,
J'essaye de faire deux classes :

1 - une classe vecteur (un tableau unidimensionnel de nombres) (K = float par exemple) :

class Vecteur{


public:


K * vecteur;
int n;


Vecteur(){cerr<<"Pas de constructeur par défaut"<<endl;exit(1);}
Vecteur(const Vecteur& v) : n(v.n),vecteur(new K[v.n])
{for(int i=0;i<n;i++) vecteur[i]=v.vecteur[i];}
Vecteur(int i) : n(i),vecteur(new K[i]){assert(vecteur);}
Vecteur(int i, K* p): n(i), vecteur(p) {assert(vecteur);}
Vecteur& operator=(Vecteur v)
{assert(n==v.n);
for(int i=0;i<n;i++) vecteur[i]=v.vecteur[i];
return *this;
}
~Vecteur(){delete[] vecteur;}
K & operator[](int i) const {assert(i>=0 && i<n); return vecteur[i];}

};

2- et une classe matrice (deux dimensions) :

class Matrice{


public:


K ** matrice;
int n;
int m;


Matrice(){cerr<<"Pas de constructeur par défaut"<<endl;exit(1);}
Matrice(const Matrice& nm) : n(nm.n), m(nm.m), matrice(new K*[n]){
assert(matrice);
for (int fk=0;fk<n;fk++){
matrice[fk]=new K[m];
assert(matrice[fk]);
for (int ij=0;ij<m;ij++) matrice[fk][ij]=nm.matrice[fk][ij];}}
Matrice(int i, int j) : n(i), m(j), matrice(new K*[i]) {
assert(matrice);
for (int fk=0;fk<n;fk++){
matrice[fk]=new K[j];
assert(matrice[fk]);}}
~Matrice(){for (int fk=0;fk<n;fk++) delete[] matrice[fk]; delete[] matrice;}


K & operator()(int i, int j) const {assert(i>=0 && i<n && j>=0 && j<m);return matrice[i][j];}


Vecteur operator[](int i) const{
assert(i>=0 && i<m);
K *w(new K[n]);
for (int j=0;j<n;j++) w[j]=matrice[j][i];
return Vecteur(n,w);}
};

Le dernier opérateur devrait me permettre de créer un vecteur à partir d'une colonne de la matrice. Mais ça marche moyennement (c'est à dire que ça marche, mais ça doit faire des opérations que je ne souhaite pas ... )
En fait lorsque j'essaye d'utiliser tout ça dans un mini code :

typedef Vecteur Vect;
typedef Matrice Mat;


int main(int argc, char ** argv)
{


Mat b(2,2);b(0,0)=0;b(0,1)=1;b(1,1)=1;b(1,0)=1;
Vect b1=b[1]; // <- utilisation du fameux opérateur
Mat c=b; //<-ce simple appel du constructeur par copie semble maintenant entrainer un bug ...


}

ça plante lamentablement, et je n'arrive pas à voir pourquoi. Si vous avez des idées...

2 réponses

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
24 févr. 2005 à 19:42
Pour le corps de copie (copy ctor & operator=) faudrais peut etre penser aux éventuelles libération et allocations.

Et "don't reinvent the wheel", appuiye toi sur ce qui existe déjà,
surtout que implementer une classe matrice avec un pointeur de pointeur
c'est trés mauvais pour les performance, la logique c'est de
l'implementer à partir d'un vecteur.



Si tu ne veux pas de default ctor, plutot que de faire



class Matrice{


public:



Matrice(){cerr<<"Pas de constructeur par défaut"<<endl;exit(1);}



}



c'est mieux de faire

class Matrice{

private: Matrice();



}



histoire d'avoir un vrai diagnostic à la compilation plutot qu'un exit qui peut causer beaucoup de dégat (invoque abort)
0
scyrille Messages postés 2 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 25 février 2005
25 févr. 2005 à 11:19
Voila la classe matrice est maintenant construite à partir d'un vecteur. Je n'ai rien changé en ce qui concerne l'allocation et le desallocation (normalement c'est fait par les new K[n] et delete[] à moins que je me sois trompé. Bizarement, ça ne plante plus.
Je réinvente la roue parce que les classes proposées sont généralement incroyablement compliquée et du coup rajouter une fonction parfois simple est extremement couteux (pour un novice comme moi).

Merci pour ton aide. Si jamais tu vois une erreur grossière, dis le moi (en particulier j'essaye d'utiliser la notion d'heritage ue je suis loin de connaitre très bien !)

class Vecteur{


public:


K * vecteur;
int n;


Vecteur();
Vecteur(const Vecteur& v) : n(v.n),vecteur(new K[v.n]){
for(int i=0;i<n;i++) vecteur[i]=v.vecteur[i];}
Vecteur(int i) : n(i),vecteur(new K[i]){assert(vecteur);}
Vecteur(int i, K* p): n(i), vecteur(p) {assert(vecteur);}
Vecteur& operator=(Vecteur v){
assert(n==v.n);
for(int i=0;i<n;i++) vecteur[i]=v.vecteur[i];
return *this;
}
~Vecteur(){delete[] vecteur;}
K & operator[](int i) const {assert(i>=0 && i<n); return vecteur[i];}

};






class Matrice: public Vecteur{


public:


int m;


Matrice();
Matrice(const Matrice& nm) : Vecteur(nm.n), m(nm.m) {
for (int fk=0;fk<n;fk++) vecteur[fk]=nm.vecteur[fk];}
Matrice(int i, int j) : Vecteur(i*j),m(j){}


K & operator()(int i, int j) const {assert(i>=0 && i<n/m && j>=0 && j<m);return vecteur[i+j*m];}
Matrice & operator=(Matrice ma){
this->Vecteur::operator=(ma);m=ma.m;return *this;}


Vecteur operator[](int i) const{
assert(i>=0 && i<m);
K *w(new K[n]);
for (int j=0;j<n;j++) w[j]=vecteur[j+i*m];
return Vecteur(n,w);}
};



typedef Vecteur Vect;
typedef Matrice Mat;

//exemple d'utilisation


int main(int argc, char ** argv)
{


Mat b(2,2);b(0,0)=0;b(0,1)=1;b(1,1)=1;b(1,0)=1;
Vect b1=b[1];
Mat c=b;
cout<


}
0
Rejoignez-nous