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 :

has incomplete type,forward declaration of ,


Sujet :

C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut has incomplete type,forward declaration of ,
    Salut!

    En tentant de compiler ce code:
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    #ifndef ELECTRONIC
    #define ELECTRONIC
     
    #include <vector>
    #include <string>
     
    #ifndef BIT
    typedef char BIT;
    #else
    #error BIT is already defined
    #endif
     
     
    class Component;
    class ComponentPort;
    class BooleanPolynom;
    class BinaryOperator;
    class Bit;
     
     
     
    class Component{
    private:
        unsigned fanIn;
        unsigned fanOut;
     
        std::string name;
     
        std::vector<ComponentPort*> inBuffer;
        std::vector<ComponentPort*> outBuffer;
     
        BooleanPolynom function;
    public:
        /*Default constructor*/
        Component():fanIn(0),fanOut(0){};
        /*Binary constructor*/
        Component(unsigned _fanIn,unsigned _fanOut):fanIn(_fanIn),fanOut(_fanOut){}
     
        std::string getName(void);
        unsigned getFanIn(void);
        unsigned getFanOut(void);
    };
     
     
    class ComponentPort{
    private:
       Component* currentComponent;
       Component* connectedComponent;
     
        Bit value;
        unsigned index;
     
    public:
        Bit getValue(void);
        unsigned getIndex(void);
        Component* getCurrentComponent(void);
        Component* getConnectedComponent(void);
    };
     
     
    class BooleanPolynom{
    private:
        bool isBit;
     
        BinaryOperator binaryOperator;
     
        BooleanPolynom* leftBooleanPolynom;
        BooleanPolynom* rightBooleanPolynom;
     
    public:
        Bit evaluate(void);
    };
     
    Bit BooleanPolynom::evaluate(void){
     
        if(isBit){
            return (static_cast<Bit> (this))->value;
        }
     
        Bit firstOperand=leftBooleanPolynom->evaluate();
        Bit secondOperand=rightBooleanPolynom->evaluate();
     
        return binaryOperator(firstOperand,secondOperand);
     
    }
     
    class Bit : public BooleanPolynom{
    private:
        BIT value;
    public:
        Bit(BIT _value):value(_value){}
     
        BIT getValue(void);
    };
     
    BIT Bit::getValue(void){
        return value;
    }
     
     
    class BinaryOperator{
     
    public:
        virtual Bit operator()(Bit b0,Bit b1)=0;
    };
     
     
    class AND : public BinaryOperator{
        Bit operator()(Bit b0,Bit b1){
            Bit result((b0.getValue())&(b1.getValue()));
            return result;
        }
    };
    #endif
    les erreurs pleuvent:
    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
     
    32  field `function' has incomplete type 
    50 field `value' has incomplete type 
    65 field `binaryOperator' has incomplete type 
    In member function `Bit BooleanPolynom::evaluate()': 
    74 return type `struct Bit' is incomplete 
    77 invalid use of undefined type `struct Bit' 
    18 forward declaration of `struct Bit' 
    80 variable `Bit firstOperand' has initializer but incomplete type 
    80  invalid use of undefined type `struct Bit' 
    18  forward declaration of `struct Bit' 
    81 variable `Bit secondOperand' has initializer but incomplete type 
    81  invalid use of undefined type `struct Bit' 
    18 forward declaration of `struct Bit' 
    83 `binaryOperator' undeclared (first use this function)
    Beaucoup semble étranges:
    -les "incomplete type" alors que les classes sont définies.
    -les "forward declaration" alors que ce ne sont que des déclarations.

    Merci de votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par seriousme
    -les "incomplete type" alors que les classes sont définies.
    Les classes concernées par les "incomplete type" ne sont pas définies, elles ne sont que déclarées. Pour déclarer une donnée membre d'un type, il faut que ce type soit complètement défini, donc dans ton cas il faut la déclaration des classes.

    On ne peut faire une déclaration anticipée que quand on manipule des références ou des pointeurs sur le type concerné. Vu que tes membres sont des objets, ça ne marche pas.

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Les classes concernées par les "incomplete type" ne sont pas définies, elles ne sont que déclarées. Pour déclarer une donnée membre d'un type, il faut que ce type soit complètement défini, donc dans ton cas il faut la déclaration des classes.
    En quoi ne sont elles pas définies?

    Les méthodes sont définies, les champs ont des types qui sont aussi définis, non?

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    On ne peut faire une déclaration anticipée que quand on manipule des références ou des pointeurs sur le type concerné. Vu que tes membres sont des objets, ça ne marche pas.
    En mettant la définition de la classe "Bit" avant celle de "BooleanPolynom" les "forward declaration" disparaissent.
    Pourquoi?

    Qu'importe au compilo que la classe soit définie au début ou à la fin du moment qu'il connait son existence via sa déclaration?

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Il faut définir tes classes dans le bon ordre.

    Par exemple, dans "Component", tu as "BooleanPolynom function;". Donc il faut que tu définisses ta classe BooleanPolynom avant ta classe Component.

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Eusebe
    Il faut définir tes classes dans le bon ordre.

    Par exemple, dans "Component", tu as "BooleanPolynom function;". Donc il faut que tu définisses ta classe BooleanPolynom avant ta classe Component.
    C'est plutôt étrange que le compilo ne soit pas capable de chercher la définition de la classe plus loin alors qu'elle a été déclarée.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par seriousme
    Qu'importe au compilo que la classe soit définie au début ou à la fin du moment qu'il connait son existence via sa déclaration?
    Justement, non. Au moment où tu déclares les membres, leur type doit être complètement défini.

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Mais là ca risque de tourner en rond car "Bit" a besoin de "BooleanPolynom" par héritage et "BooleanPolynom" se sert de "Bit".

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par seriousme
    Mais là ca risque de tourner en rond car "Bit" a besoin de "BooleanPolynom" par héritage et "BooleanPolynom" se sert de "Bit".
    Exact

    Faire hériter Bit de BooleanPolynom est une erreur de conception : si je comprends bien ton code, Bit n'a pas de polynome gauche et droit. Je suppose que quelque part dans BooleanPolynom, tu mettras des fonctions permettant d'affecter ces deux polynome. Bit ne respectera alors pas cette interface, et ne devrait donc pas hériter de BooleanPolynom.

    Voir http://www.parashift.com/c++-faq-lit....html#faq-21.6 et les questions suivantes pour l'utilisation de l'héritage.

  10. #10
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    En fait c'est une application directe de la théorie des polynomes boolens:
    -une variable booleenne, ici représentée par "Bit", est un polynome booleen.
    -si p1 et p2 sont des polynomes booleens alors operateur(p1,p2) est un polynome booleen.

    Donc faire hériter "Bit" de "BooleanPolynom" semble logique; il suffit juste de mettre à NULL tous les pointeurs.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par roulious
    Faire hériter Bit de BooleanPolynom est une erreur de conception
    Mouais, pas évident.

    En revanche utiliser le type Bit dans sa propre classe de base, ça c'est une grosse bêtise qui mérite à elle seule de se repencher sur la conception !

    .

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par seriousme
    C'est plutôt étrange que le compilo ne soit pas capable de chercher la définition de la classe plus loin alors qu'elle a été déclarée.
    La compilation est déjà suffisament lente quand le code est mal organisé. Si en plus il fallait payer une passe supplémentaire juste pour savoir :
    - le nombre d'octet à réserver pour les attributs
    - des bouts de code pour les E/S de fonctions
    - ...
    alors le café, on aurait le temps de le moudre nous même.

  13. #13
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Luc Hermitte
    La compilation est déjà suffisament lente quand le code est mal organisé. Si en plus il fallait payer une passe supplémentaire
    La seconde passe serait plus légère car centrée sur les problèmes de définition trouvés lors de la première passe.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/05/2015, 17h28
  2. Réponses: 2
    Dernier message: 09/12/2011, 08h03
  3. Erreur de compilation : has incomplete type
    Par Plomeg dans le forum C++
    Réponses: 2
    Dernier message: 25/04/2009, 13h19
  4. has initializer but incomplete type
    Par laflak dans le forum C
    Réponses: 3
    Dernier message: 25/03/2008, 18h05
  5. Réponses: 3
    Dernier message: 23/01/2008, 16h04

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