IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème de fonction friend sur trois classes.


Sujet :

C++

  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut Problème de fonction friend sur trois classes.
    Bonjour.

    Pour m'entraîner à manipuler les classes, j'ai voulu créer un système de coordonnées selon le code qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #ifndef Def_Repere
    #define Def_Repere
    #include<math.h>
    class Cylin;
    class Spher;
    class Carth //coordonnées carthésiennes
    {
    	double X;
    	double Y;
    	double Z;
    public:
    	Carth(double x=0,double y=0,double z=0)//entree des coordonées
    	{
    		X=x;
    		Y=y;
    		Z=z;
    	}
    	Carth(Carth &point)//copie d'un autre point
    	{
    		X=point.X;
    		Y=point.Y;
    		Z=point.Z;
    	}
    	Carth(Cylin &point);//convertion cylindriques->carthesiennes
    	Carth(Spher &point);//convertion spheriques->carthesiennes
    	friend Cylin::Cylin(Carth &point);
    	friend Spher::Spher(Carth &point);
    	double GetCoord(int num=1);
    };
     
    class Cylin //coordonnées cylindriques
    {
    	double r;
    	double Theta;
    	double Z;
    public:
    	Cylin(double R=0,double theta=0,double z=0)//entree des coordonées
    	{
    		r=R;
    		Theta=theta;
    		Z=z;
    	}
    	Cylin(Cylin &point)//copie d'un autre point
    	{
    		r=point.r;
    		Theta=point.Theta;
    		Z=point.Z;
    	}
    	Cylin(Carth &point);//convertion carthesiennes->cylindriques
    	Cylin(Spher &point);//convertion spheriques->cylindriques
    	friend Carth::Carth(Cylin &point);
    	friend Spher::Spher(Cylin &point);
    	double GetCoord(int num=1);
    };
     
    class Spher //coordonnées sphériques
    {
    	double r;
    	double Theta;
    	double Phi;
    public:
    	Spher(double R=0,double theta=0,double phi=0)//entree des coordonées
    	{
    		r=R;
    		Theta=theta;
    		Phi=phi;
    	}
    	Spher(Spher &point)//copie d'un autre point
    	{
    		r=point.r;
    		Theta=point.Theta;
    		Phi=point.Phi;
    	}
    	Spher(Carth &point);//convertion carthesiennes->Spheriques
    	Spher(Cylin &point);//convertion carthesiennes->Spheriques
    	friend Carth::Carth(Spher &point);
    	friend Cylin::Cylin(Spher &point;
    	double GetCoord(int num=1);
    };
     
    #endif
    d'ou je ne vois pas trop les erreurs
    or le compilateur me lance alors une bordée d'injures dés que j'essaye de compiler (je n'ai mis que le debut, il me sort 104 erreurs):
    Citation Envoyé par Le Compilateur
    ------ Début de la génération : Projet : Moteur physique, Configuration : Debug Win32 ------
    Compilation en cours...
    convert.cpp
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(26) : error C2027: utilisation du type non défini 'Cylin'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(4) : voir la déclaration de 'Cylin'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(26) : error C2256: utilisation non conforme du spécificateur friend sur 'Carth::Carth'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(27) : error C2027: utilisation du type non défini 'Spher'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(5) : voir la déclaration de 'Spher'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(27) : error C2256: utilisation non conforme du spécificateur friend sur 'Carth::Carth'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(50) : error C2143: erreur de syntaxe : absence de ')' avant '&'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(50) : error C2143: erreur de syntaxe : absence de ';' avant '&'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(50) : error C2460: 'Cylin::Spher' : utilise 'Cylin', en cours de définition
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(32) : voir la déclaration de 'Cylin'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(50) : error C2059: erreur de syntaxe : ')'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(50) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(52) : error C2027: utilisation du type non défini 'Spher'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(5) : voir la déclaration de 'Spher'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(52) : error C2256: utilisation non conforme du spécificateur friend sur 'Cylin::Cylin'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(75) : error C2143: erreur de syntaxe : absence de ')' avant '&'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(75) : error C2143: erreur de syntaxe : absence de ';' avant '&'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(75) : error C2460: 'Spher::Cylin' : utilise 'Spher', en cours de définition
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(57) : voir la déclaration de 'Spher'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(75) : error C2059: erreur de syntaxe : ')'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(75) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(77) : error C2061: erreur de syntaxe : identificateur 'Spher'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(77) : error C2143: erreur de syntaxe : absence de ')' avant ';'
    d:\dossiers & prog\programation\c\c++\init\moteur physique\moteur physique\points.h(77) : error C2245: fonction membre 'Cylin::{ctor}' inexistante spécifiée en tant que friend (la signature de la fonction membre ne correspond à aucune surcharge)
    ...
    La plupart de ces erreurs portent sur les fonctions friend: il me dit que les constructeurs ne peuvent pas être définis comme friend, seulement il me semblais que ce n'étais pas valable pour les constructeurs d'autres classes.
    enfin, je ne crois pas qu'il soit pertinent de mettre ces classes amies...

    merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne pense pas que tu puisses rendre amie une fonction membre. Je ne pense pas non plus que, même si c'était possible, le compilo pourrait le faire sans connaître la définition de la classe en question (tu n'as qu'une déclaration anticipée).

    Bref, la solution de toute façon est là :
    enfin, je ne crois pas qu'il soit pertinent de mettre ces classes amies...
    Complétement... puisque tu as une fonction publique qui renvoie les coordonnées. Et si tu voulais garder ces coordonnées privées, quel serait l'intérêt ?

  3. #3
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Laurent Gomila
    (tu n'as qu'une déclaration anticipée).
    SI! :
    Citation Envoyé par Moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Cylin;
    class Spher;
    Citation Envoyé par Laurent Gomila
    Complétement... puisque tu as une fonction publique qui renvoie les coordonnées. Et si tu voulais garder ces coordonnées privées, quel serait l'intérêt ?
    certes, mais pour l'optimisation, c'est pas super. et comme, j'ai lu qu'il était déconseillé de mettre les variable d'une classe en public
    (en plus, je compte supprimer la fonction GetCoords, je l'avais utilisée pour faire un test sur ces classes...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par méphistopheles
    SI! :
    Citation Envoyé par Moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Cylin;
    class Spher;
    ?
    C'est bien ce que je dis, tu n'as que des déclarations anticipées, pas la définition complète des classes qui permettrait au compilo de savoir que ces classes possèdent les fonctions que tu veux rendre amies.

    certes, mais pour l'optimisation, c'est pas super
    Tu peux développer ?

    et comme, j'ai lu qu'il était déconseillé de mettre les variable d'une classe en public
    Faut pas prendre ce conseil à la lettre. Pour ce genre de classe c'est justement conseillé ; sans ça on se retrouve vite à écrire du code 100 fois trop verbeux qui ne fait rien de plus que ce qu'on aurait fait très naturellement en laissant ces variables publiques.

    (en plus, je compte supprimer la fonction GetCoords, je l'avais utilisée pour faire un test sur ces classes...
    Mais... A quoi est censée servir ta classe Carth avec des coordonnées inaccessibles ?

  5. #5
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Laurent Gomila
    C'est bien ce que je dis, tu n'as que des déclarations anticipées, pas la définition complète des classes qui permettrait au compilo de savoir que ces classes possèdent les fonctions que tu veux rendre amies.
    oups désolé, j'avais mal lu. mais vu que ces fonction là, définies apres font également appel à une classe amie, je risque de sereieusement galérer. à mois que la définition complete ne soit pas ce que j'ai écris à la suite...


    Citation Envoyé par Laurent Gomila
    Tu peux développer ?
    he bien passer par une fonction pour aquérir des points ajoute un appel et donc ralentit.


    Citation Envoyé par Laurent Gomila
    Faut pas prendre ce conseil à la lettre. Pour ce genre de classe c'est justement conseillé ; sans ça on se retrouve vite à écrire du code 100 fois trop verbeux qui ne fait rien de plus que ce qu'on aurait fait très naturellement en laissant ces variables publiques.
    ha... ben dans ce cas, je vais suivre tes trés avisés conseils. mais... est-il possible de rendre le header entier accassible à une autre classe uniquement (ça re viendrais à tout mettre privé dans les classe et à mettre un certains nombre de classes amies, mais ça deviendrais tres compliqué.)


    Citation Envoyé par Laurent Gomila
    Mais... A quoi est censée servir ta classe Carth avec des coordonnées inaccessibles ?
    je voudrais n'utiliser ces classes que dans deux trois autres classes en fait, mais pas les rendre publiques...


    merci.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    he bien passer par une fonction pour aquérir des points ajoute un appel et donc ralentit.
    Si c'est vraiment un problème met ton accesseur inline.

    ha... ben dans ce cas, je vais suivre tes trés avisés conseils. mais... est-il possible de rendre le header entier accassible à une autre classe uniquement (ça re viendrais à tout mettre privé dans les classe et à mettre un certains nombre de classes amies, mais ça deviendrais tres compliqué.)
    je voudrais n'utiliser ces classes que dans deux trois autres classes en fait, mais pas les rendre publiques...
    Je ne suis pas encore certain de l'intérêt de cacher une telle classe.
    Mais si tu tiens réellement à le faire... j'ai pas vraiment de solution à te proposer

Discussions similaires

  1. Problème avec fonction tuple sur Python 3.4.1
    Par inconnito2 dans le forum Général Python
    Réponses: 4
    Dernier message: 28/12/2014, 12h57
  2. Problème de l'opérateur << sur ma classe
    Par Dolphin Dice dans le forum C++
    Réponses: 2
    Dernier message: 19/04/2014, 10h37
  3. Problème de jointure externe sur trois tables
    Par arnovodao dans le forum Langage SQL
    Réponses: 7
    Dernier message: 28/11/2012, 14h20
  4. Réponses: 3
    Dernier message: 16/04/2004, 16h51
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo