byron | Bon, voilà ou j'en suis dans mon probleme. Lors de la compilation de mon fichier .c, j'obtiens 2 erreurs.
Code :
- // Fichier 'vecteur.h'
- #ifndef _VECTEUR_H
- #define _VECTEUR_H
- class Vecteur
- {
- private:
- int taille;
- double * val;
- public:
- Vecteur(int=0,double * =NULL); //Constructeur avec valeurs par défaut.
- //Ex:Si on fait Vecteur v3(4), on obtient un vecteur
- //de taille 4, mais de valeur NULL.
- Vecteur(const Vecteur &); //Constructeur par copie.
- //On rajoute la contrainte 'const' qui agit comme une
- //une sécurité:le constructeur par copie ne doit pas
- //modifier la valeur.
- //Ce constructeur permet de faire: Vecteur v4=v5.
- ~Vecteur(); //Destructeur.
- Vecteur somme1(Vecteur); //fonction membre.
- friend Vecteur somme2(Vecteur,Vecteur); //Fonction amie
- //'friend' permet d'acceder aux variables
- //privées de la classe.
- Vecteur operator+ (Vecteur); //Surcharge de l'operateur +.
- Vecteur & operator= (const Vecteur &); //Permet v1=v2=v3.
- double & operator[] (int); //Permet x=v[1].
- double norme(); //Calcul de la norme d'un vecteur.
- double operator* (Vecteur); //Permet v4=v3*v2.
- friend Vecteur operator* (double,Vecteur); //Produit d'un vecteur par un scalaire.
- void normalise(); //Normalisation.
- void affiche(); //Affichage d'un vecteur sous forme d'une
- //fonction membre.
- friend ostream & operator<< (ostream &,const Vecteur &);
- //Permet d'écrire directement: cout <<"v3="<<v3<<endl au lieu de faire v3.affiche().
- double cosinus (Vecteur,Vecteur);
- };
- #endif
- //Fichier 'vecteur.c'
- #include <iostream.h> //Necessaire pour utiliser 'cout' pour les traces Constr/Destr.
- #include <assert.h>
- #include <math.h>
- #include "vecteur.h"
- //Constructeur
- Vecteur::Vecteur(int t,double * s)
- {
- taille=t;
- val=new double[taille];
- if (s!=NULL)
- {
- for (int i=0;i<taille;i++)
- val[i]=s[i];
- }
- //Trace d'appel du constructeur:
- cout <<"Constructeur:taille="<<taille;
- cout <<"Valeur=";
- if(s) {cout <<"oui";}
- else {cout <<"non";}
- cout <<endl;
- }
- //Constructeur par copie:
- Vecteur::Vecteur(const Vecteur & v)
- {
- taille=v.taille;
- val=new double[taille];
- for(int i=0;i<taille;i++)
- val[i]=v.val[i];
- //Trace d'appel du constructeur par copie:
- cout<<"Constructeur par copie"<<endl; // J'enleve le this qui me provoque une erreur.
- }
- //Destructeur:
- Vecteur::~Vecteur()
- {
- delete [] val;
- cout<<"Destructeur"<<endl;
- }
- //Somme de vecteurs:
- Vecteur Vecteur::somme1(Vecteur v)
- {
- assert(taille==v.taille); //Si condition OK, on continue, sinon arret du programme.
- //Si les deux vecteurs n'ont pas la même taille==>abort!
- Vecteur result(taille);
- for (int i=0;i<taille;i++)
- {
- result.val[i]=val[i]+v.val[i];
- }
- return result;
- }
- Vecteur somme2(Vecteur v1,Vecteur v2)
- {
- assert(v1.taille==v2.taille);
- Vecteur result(v1.taille);
- for (int i=0;i<v1.taille;i++)
- {
- result.val[i]=v1.val[i]+v2.val[i];
- }
- return result;
- }
- Vecteur Vecteur::operator+ (Vecteur v)
- {
- assert(taille==v.taille);
- for (int i=0;i<taille;i++)
- {
- v.val[i]+=val[i];
- }
- return v;
- }
- //On veut pourvoir écrire v1=v2 ==>On surcharge l'operateur =:
- Vecteur & Vecteur::operator= (const Vecteur & v)
- {
- if (taille !=0)
- {
- delete [] val; // On efface et on initialise
- taille=0;
- taille=v.taille;
- val=new double [taille];
- for (int i=0;i<taille;i++)
- {
- val[i]=v.val[i];
- }
- return * this; // Renvoie la reference à l'objet.
- // Obligatoire si on veut enchainer v1=v2=v3=...
- }
- // Rq: Que se passe-t-il si on fait v1=v1? Que rajouter?
- double & Vecteur::operator[] (int i)
- { //erreur ici
- assert((i>=0)&&(i<taille));
- return val[i];
- }
- // Norme d'un vecteur:
- double Vecteur::norme()
- {
- double norme=0;
- for (int i=0;i<taille;i++)
- {
- norme=norme+val[i]*val[i];
- }
- return sqrt(norme);
- }
- // Produit scalaire
- double Vecteur::operator* (Vecteur v)
- {
- assert(taille==v.taille);
- double result=0; // Variable locale
- for (int i=0;i<taille;i++)
- {
- result=result+val[i]*v.val[i];
- }
- return result;
- }
- // Produit réel par vecteur:
- Vecteur operator* (double x,Vecteur v)
- {
- for (int i=0;i<v.taille;i++)
- {
- v.val[i]=x*v.val[i];
- }
- return v;
- }
- // Normalisation d'un vecteur:
- void Vecteur::normalise()
- {
- double n=norme();
- for (int i=0;i<taille;i++)
- {
- val[i]=val[i]/n;
- }
- }
- // Affichage:
- void Vecteur::affiche() // v4.affiche()
- {
- cout<<"( ";
- for (int i=0;i<taille;i++)
- {
- if (i!=0) cout<<",";
- cout<<val[i];
- }
- cout<<" )"<<endl;
- }
- // Surcharge de <<: On va pouvoir faire 'cout<<v4<<endl;'
- ostream & operator<< (ostream & f,const Vecteur v)
- {
- f<<"( ";
- for (int i=0;i<v.taille;i++)
- {
- if (i!=0) f<<",";
- f<<v.val[i];
- }
- f<<" )";
- return f;
- }
- // Fonction cosinus
- double cosinus (Vecteur v1,Vecteur v2)
- {
- v1.normalise();
- v2.normalise();
- return v1*v2;
- }
- Erreurs de compilation:
- vecteur.cpp
- h:\linux\vecteur.cpp(113) : error C2601: '[]' : local function definitions are illegal
- h:\linux\vecteur.cpp(113) : fatal error C1903: unable to recover from previous error(s); stopping compilation
- Error executing cl.exe.
|
Message édité par byron le 13-10-2002 à 14:35:10
|