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 :

Deux classes dépendantes de la même structure - Problème de déclaration anticipée


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Deux classes dépendantes de la même structure - Problème de déclaration anticipée
    Bonjour,

    J'ai pas trouvé de réponse à mes questions en fouillant sur le web alors je poste sa ici:

    J'ai codé avec la fac un header "complex.h" - dont je suis très fier - qui contient une structure Complex ainsi que pleins de fonctions qui me permettent de faire des opérations dessus (j'en met une pour l'exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct Complex
    {
        float x, y;  
    };
     
    Complex operator+ (Complex c1, Complex c2)
    {
        Complex cr;
        cr.x = c1.x + c2.x;
        cr.y = c1.y + c2.y;
        return cr;
    }

    Initialement, j'avais une structure A qui possédait un tableau d'une structure B.
    Les deux structures utilisaient le même header, tout fonctionnais parfaitement bien, jusqu’à ce que je me décide à structurer mon programme (tout le code était dans le même fichier) et que je transforme ces structures en classes.

    ->A et B ont des struct Complex comme attributs et méthodes


    Hélas, sa a pas plus a mon compilo:
    Dans un premier temps, pour éviter la double définition, j'ai changé le "#include "complex.h"" dans les headers de mes deux classes par une définition plus propre "struct complex;".
    J'en ai profité pour décaller mon include dans mon main.

    Ensuite ça m'as affiché l'erreur suivante que j'ai pu esquiver en remplaçant les attributs et méthodes de mes classes par des pointeurs : de "Complex m_position" je suis passé à "Complex* m_position"
    error: return type 'struct Complex' is incomplete

    A ce point la, les accesseurs ont l'air de fonctionner (en tout cas ils compilent) mais je n'arrive pas à utiliser les fonctions qui sont dans mon complexe.h, logique puisque je fait des opérations non plus sur des complexes, mais sur des pointeurs de complexe.
    Par contre j'avoue que je ne sais pas comment gérer les pointeurs de cette façon

    J'aurais besoins d'un peu d'aide pour faire tourner un programme qui ressemble à ça avec l'aide de l'operator+ que j'ai défini plus haut dans le header:
    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
    class B
    {
        public:
            B();
            void avancer();
    
        private:
            Complex* m_position
            Complex* m_vitesse
    };
    
    void B::avancer()
    {
        this->m_position = this->m_position + this->m_velocite;  //j'en profite pour vous demander si le this-> est utile ou non dans ce cas
    }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    C'est un problème assez classique en C++ On ne pas faire de déclaration anticipée des structures ("forward declaration" en anglais)

    Source stackoverflow : Forward declaration of struct

    Donc la solution Je ne sais pas, tout mettre dans la même entête (.h) et faire différentes sources si nécessaire (complex.cpp, A.cpp et B.cpp - en C++, on peut avoir plusieurs sources .cpp/ .c pour 1 entête .h)

    Et avoir une entête style (mais pas sûr que cela fonctionne )

    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
    struct Complex {
    };
     
     
    // Forward Declaration
    class B;
     
    class A {
    //  ...
     
        std::vector<B> tab;
    };
     
     
    class B {
    };

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Wow! Je ne pensais pas que la solution tomberai si vite

    J'ai repris l'entête que tu m'as envoyé et sa marche nikel

    on peut avoir plusieurs sources .cpp/ .c pour 1 entête .h
    J'aurais mis longtemps avant de comprendre cette phrase, j'ai pris la mauvaise habitude d’écrire le corps de mes fonctions dans des .h et mon problème part de la

    Merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ces deux classes font-elles la même chose ?
    Par topolino dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 08/01/2016, 13h53
  2. Réponses: 3
    Dernier message: 08/02/2013, 11h03
  3. Réponses: 6
    Dernier message: 30/05/2012, 20h19
  4. Deux classes CSS pour une même cellule d'un tableau
    Par bernidupont dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 04/05/2011, 21h34
  5. Réponses: 1
    Dernier message: 30/08/2010, 12h15

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