Problème de définition d'une classe en C++

Signaler
Messages postés
4
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
27 décembre 2003
-
Messages postés
4
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
27 décembre 2003
-
Bonjour,
Je suis en train de créer un programme permettant de tracer des rayons optiques à travers plusieurs lentilles. Pour cela, j'ai créé 2 classes: une classe Lentille (qui fait les calculs pour une seule lentille) et une classe Systeme (qui fait les calculs pour toutes les lentilles). Ce sont des calculs matriciels. J'ai une erreur de déclaration de calsse, mais je ne comprends pas d'où elle vient...
Voici la déclaration de la classe Lentille:
class Lentille
{
float FocaleLentille;
float DistanceObjet;

public:

Lentille();
~Lentille();
float Vergence(float& V);
float MatriceRefraction(float V);
float MatriceTranslation(float d);
float MatriceTransfert(int m, int n);
void EcrireFocaleLentille(float focale);
float LireFocaleLentille();
void EcrireDistanceObjet(float distance);
float LireDistanceObjet();

};

erreur affichée:
c:\documents and settings\propriétaire\bureau\istase\projet info\versionsofiane\lentille.h(6) : error C2011: 'Lentille' : 'class' type redefinition
Error executing cl.exe.

Pourquoi s'agit-il d'une erreur de redéfinition?
Dans Lentille.cpp, je declare: #include "Lentille.h"
La classe Systeme hérite de la classe Lentille, je déclare donc: #include "Lentille.h"

Voici le code de Lentille.cpp:
Lentille::Lentille()
{
float FocaleLentille=(float)0.1;
float Diametre=(float)0.2;
float PositionObjet=0;
float TailleObjet=0;

}

Lentille::~Lentille()
{
}

float Lentille::Vergence(float& V)
{

FocaleLentille=(float)0.1;
V=1/FocaleLentille;
cout<<"La vergence est: V= "<<V<<endl;
return V;
}

float Lentille::MatriceRefraction(float V)
{
float MR[2][2];
MR[0][0]=1;
MR[0][1]=0;
MR[1][0]=-V;
MR[1][1]=1;

/*int i, j;
for (i=0; i<2; i++)
{
for (j=0; j<2; j++)
{
cout<<MR[i][j];
cout<<endl;
}
}
*/
return MR[2][2];
}

float Lentille::MatriceTranslation(float d)
{
float MT[2][2];
d=1.5; // valeur donnée par MFC
MT[0][0]=1;
MT[0][1]=d;
MT[1][0]=0;
MT[1][1]=1;
/*
for (i=0; i<2; i++)
{
for (j=0; j<2; j++)
{
cout<<MT[i][j];
cout<<endl;
}
}
*/
return MT[2][2];
}

float Lentille::MatriceTransfert(int n, int m)
{
float MF[2][2];
float MT[2][2],MR[2][2];
int i,j,k;
for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
{
MF[i][j]=0;
for (k=0;k<2;k++) MF[i][j]+=MT[i][k]*MR[k][j];
}
}
for (i=0; i<2; i++)
{
for (j=0; j<2; j++)
{
cout<<MF[i][j];
cout<<endl;
}
}
return MF[n][m];
}

void Lentille::EcrireFocaleLentille(float focale)
{
FocaleLentille = focale;
}

float Lentille::LireFocaleLentille()
{
return FocaleLentille;
}

void Lentille::EcrireDistanceObjet(float distance)
{
DistanceObjet=distance;
}

float Lentille::LireDistanceObjet()
{
return DistanceObjet;
}

D'où peut provenir cette erreur?
Merci de me venir en aide.
;)

6 réponses

Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
j'ai pas tout vu essaye ca :
ds ton fichier .h où il y a ta classe :
#ifndef LENTILLE_H_
#define LENTILLE_H_

et tout à la fin du .h mets :
#endif
Messages postés
4
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
27 décembre 2003

Merci beaucoup!!! Mon problème venait bien de là. Décidément, plus les erreurs sont bêtes, plus on se prend la tête avec...

;)
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Lol ben derien j'ai bien galérer avec ca aussi ^^
Messages postés
4
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
27 décembre 2003

autre probleme concernant la classe systeme:
Il s'agit de calculer une matrice de transfert totale(tableau 2*2) à partir des matrices de transfert(MF) de chacunes des lentilles.

Voici la déclaration dans le .h:
float MatriceTransfertTotale(int N, float MF[2][2]);

Dans le .cpp:
float Systeme::MatriceTransfertTotale(int N, float MF[2][2])
{
float ML[2][2]; //déclaration d'une matrice temporaire
int i,j,k,l,m,n;

MF[0][0]=1; //initialisation de la matrice de transfert
MF[0][1]=0;
MF[1][0]=0;
MF[1][1]=1;

for(l=0; l<20; l++) // boucle sur les lentilles
{
for(m=0; m<2; m++) //remplissage du tableau par les matrices de transfert
{
for(n=0; n<2; n++)
{
TabLentilles[i]=lent1.MatriceTransfert(n,m);
i=i+1;
}
}
l=l+4;
}

for(l=20; l>0; l--) // vidage du tableau MF par MF
{
for(m=0; m<2; m++)
{
for(n=0; n<2; n++)
{
ML[m][n]=TabLentilles[i];
i=i-1;
}
}
l=l-4;
}

for (i=0;i<2;i++) //MatriceTransfert totale = Matrice Transfert * MatriceTransfert
{
for (j=0;j<2;j++)
{
for (k=0;k<2;k++) MF[i][j]+=MF[i][k]*ML[k][j];
}
}

return MF[i][j];
}

Dans le main:
S.MatriceTransfertTotale(N,MF[2][2]);

Erreur affichée au niveau du main:
error C2664: 'MatriceTransfertTotale' : cannot convert parameter 2 from 'float' to 'float [][2]'
There is no context in which this conversion is possible

Pourquoi ne veut-ilpas me ressortir un tableau 2*2?
J'en ai besoin pour d'autres calculs ultérieurs. D'où peut provenir cette erreur?

Merci de m'aider...

;)
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
float MatriceTransfertTotale(int N, float MF[2][2]);
tu demande de recevoir en 2eme expression un tablo de type float a 2 dimension.
Pour l'envoyer il ne faut pas le "redeclarer"
comme tu as fais avec MF[2][2]

mais plutot lancer un pointeur vers
S.MatriceTransfertTotale(N,MF);

En gros l'erreur vient de la il faudra peut eter changé float MF[2][2] dans ta fonction par float *MF mais bon essaye comme j'ai deja dis c'est plus facile quand on peut compiler pour comprendre ^^
Messages postés
4
Date d'inscription
samedi 27 décembre 2003
Statut
Membre
Dernière intervention
27 décembre 2003

Merci encore, j'ai compris mon erreur. Désolée encore pour le contre-temps...
;)