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

Discussion :

Le MOC ne veut pas compiler "correctement" mes sources

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Le MOC ne veut pas compiler "correctement" mes sources
    Bonjour, j'essaye de définir mes classes et de les implémenter uniquement dans les fichiers d'en-tête (.hpp). Ce qui est parfaitement possible en C++, voici mes sources :

    main.cpp :
    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
     
    /*
     *GGFM = Générateur Graphique de Fonctions Mathématiques
     *License = BY-NC-SA (http://creativecommons.org/licenses/by-nc-sa/2.0/fr/)
     *Créateur = Abdelite
     *GGFM/main.cpp
     */
     
    #include <QtCore>
    #include <QtGui>
    #include <QtGlobal>
     
    #include "FenetrePrincipale.hpp"
    #include "Afficheur.hpp"
     
    int main(int argc, char* argv[])
    {
        QApplication app(argc, argv);
     
        FenetrePrincipale fenetrePrincipaleDeGGFM;
     
        return app.exec();
    }
    FenetrePrincipale.hpp :
    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
     
    /*
     *GGFM = Générateur Graphique de Fonctions Mathématiques
     *License = BY-NC-SA (http://creativecommons.org/licenses/by-nc-sa/2.0/fr/)
     *Créateur = Abdelite
     *GGFM/FenetrePrincipale.hpp
     */
     
    #ifndef HEADER__FenetrePrincipale
    #define HEADER__FenetrePrincipale
     
    #include <QtCore>
    #include <QtGui>
    #include <QtGlobal>
     
    #include "Afficheur.hpp"
     
    class FenetrePrincipale : public QWidget
    {
    	Q_OBJECT
     
    	public:
    		FenetrePrincipale(QWidget* widgetParent = 0);
     
    	protected:
    		QGraphicsView* m;
    		Afficheur* i;
     
    		void resizeEvent(QResizeEvent* event);
     
    };
     
    FenetrePrincipale::FenetrePrincipale(QWidget* widgetParent)
    {
    	this->setWindowTitle("Repére Orthogonal");
    	this->setWindowIconText("icone.png");
    	this->resize(400, 450);
     
    	i = new Afficheur(this);
    	m = new QGraphicsView(i, this);
    		m->move((((this->width()) / 2) - ((m->width()) / 2)), (((this->height()) / 2) - ((m->height()) / 2)));
    		m->show();
     
    	this->show();
    }
     
    void FenetrePrincipale::resizeEvent(QResizeEvent* event)
    {
    	m->move((((this->width()) / 2) - ((m->width()) / 2)), (((this->height()) / 2) - ((m->height()) / 2)));
    }
     
    #endif //HEADER__FenetrePrincipale
    Afficheur.hpp :
    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
     
    /*!
     *GGFM = Générateur Graphique de Fonctions Mathématiques
     *License = BY-NC-SA (http://creativecommons.org/licenses/by-nc-sa/2.0/fr/)
     *Créateur = Abdelite
     *GGFM/Afficheur.hpp
     */
     
    #ifndef HEADER__Afficheur
    #define HEADER__Afficheur
     
    #include <QtCore>
    #include <QtGui>
    #include <QtGlobal>
     
    class Afficheur : public QGraphicsScene
    {
    	Q_OBJECT
     
    	public:
    		Afficheur(QObject* objectParent = 0);
     
    		QPointF returnPointOfRepereStandart(QPointF pointOfRepereOrthogonal);
    		QPointF returnPointOfRepereOrthogonal(QPointF pointOfRepereStandart);
     
    	protected:
    		QPointF pointOriginRepereOrthogonal;
    		QPointF pointOriginRepereStandart;
    };
     
    Afficheur::Afficheur(QObject* objectParent)
    {
    	this->setSceneRect(0, 0, 100, 100);
    	pointOriginRepereStandart = QPointF(0, 0);
    	pointOriginRepereOrthogonal = QPointF(50, 50);
    	QPoint kiko(0, 0);
    	QPointF kiku(0, 4.5678);
    	QLineF lino(this->returnPointOfRepereStandart(kiko), this->returnPointOfRepereStandart(kiko));
    	QLineF linu(this->returnPointOfRepereStandart(kiku), this->returnPointOfRepereStandart(kiku));
    	this->addLine(lino);
    	this->addLine(linu);
    }
     
    QPointF Afficheur::returnPointOfRepereStandart(QPointF pointOfRepereOrthogonal)
    {
    	return QPointF((pointOriginRepereOrthogonal.x() + pointOfRepereOrthogonal.x()), (pointOriginRepereOrthogonal.y() - pointOfRepereOrthogonal.y()));
    }
     
    QPointF Afficheur::returnPointOfRepereOrthogonal(QPointF pointOfRepereStandart)
    {
    	return QPointF((pointOfRepereStandart.x() - pointOriginRepereOrthogonal.x()), (pointOriginRepereOrthogonal.y() - pointOfRepereStandart.y()));
    }
     
    #endif //HEADER__Afficheur
    Voilà, maintenant quand j'essaye de compiler, on me retourne un tas d'erreur :
    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
     
    release/moc_Afficheur.o:moc_Afficheur.cpp:(.text+0x0): multiple definition of `Afficheur::returnPointOfRepereStandart(QPointF)'
    release/main.o:main.cpp:(.text+0x0): first defined here
    release/moc_Afficheur.o:moc_Afficheur.cpp:(.text+0x38): multiple definition of `Afficheur::returnPointOfRepereOrthogonal(QPointF)'
    release/main.o:main.cpp:(.text+0x38): first defined here
    release/moc_Afficheur.o:moc_Afficheur.cpp:(.text+0xf0): multiple definition of `Afficheur::Afficheur(QObject*)'
    release/main.o:main.cpp:(.text+0xec): first defined here
    release/moc_Afficheur.o:moc_Afficheur.cpp:(.text+0x2f0): multiple definition of`Afficheur::Afficheur(QObject*)'
    release/main.o:main.cpp:(.text+0x2ec): first defined here
    release/moc_FenetrePrincipale.o:moc_FenetrePrincipale.cpp:(.text+0x0): multiple definition of `Afficheur::returnPointOfRepereStandart(QPointF)'
    release/main.o:main.cpp:(.text+0x0): first defined here
    release/moc_FenetrePrincipale.o:moc_FenetrePrincipale.cpp:(.text+0x38): multiple definition of `Afficheur::returnPointOfRepereOrthogonal(QPointF)'
    release/main.o:main.cpp:(.text+0x38): first defined here
    release/moc_FenetrePrincipale.o:moc_FenetrePrincipale.cpp:(.text+0xf0): multiple definition of `FenetrePrincipale::resizeEvent(QResizeEvent*)'
    release/main.o:main.cpp:(.text+0x70): first defined here
    release/moc_FenetrePrincipale.o:moc_FenetrePrincipale.cpp:(.text+0x16c): multiple definition of `Afficheur::Afficheur(QObject*)'
    release/main.o:main.cpp:(.text+0xec): first defined here
    release/moc_FenetrePrincipale.o:moc_FenetrePrincipale.cpp:(.text+0x36c): multiple definition of `Afficheur::Afficheur(QObject*)'
    release/main.o:main.cpp:(.text+0x2ec): first defined here
    release/moc_FenetrePrincipale.o:moc_FenetrePrincipale.cpp:(.text+0x56c): multiple definition of `FenetrePrincipale::FenetrePrincipale(QWidget*)'
    release/main.o:main.cpp:(.text+0x4ec): first defined here
    release/moc_FenetrePrincipale.o:moc_FenetrePrincipale.cpp:(.text+0x784): multiple definition of `FenetrePrincipale::FenetrePrincipale(QWidget*)'
    release/main.o:main.cpp:(.text+0x7a4): first defined here
    collect2: ld returned 1 exit status
    mingw32-make[1]: *** [release\GGFM.exe] Error 1
    mingw32-make[1]: Leaving directory `C:/Users/tyuityuityui/Desktop/GGFM'
    mingw32-make: *** [release] Error 2
    Si j'implémente les méthodes dans le corps de la classe, ou si j'utilise les .cpp, ou encore si je retire la macro Q_OBJECT, tout semble fonctionner. Le problème dois sûrement venir du moc.

    Pourriez-vous s'il vous plaît m'aider à ce que ce mini-projet compile, merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    bonjour

    Je ne connais pas assez le moc pour t'expliquer l'origine du problème mais je peux donner la solution :
    il faut mettre les implémentations des fonctions directement dans la déclaration des classes et ne pas séparer :

    FenetrePrincipale.hpp
    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
    /*
     *GGFM = Générateur Graphique de Fonctions Mathématiques
     *License = BY-NC-SA (http://creativecommons.org/licenses/by-nc-sa/2.0/fr/)
     *Créateur = Abdelite
     *GGFM/FenetrePrincipale.hpp
     */
     
    #ifndef HEADER__FenetrePrincipale
    #define HEADER__FenetrePrincipale
     
    #include <QtCore>
    #include <QtGui>
    #include <QtGlobal>
     
    #include "afficheur.hpp"
     
    class FenetrePrincipale : public QWidget
    {
        Q_OBJECT
     
        public:
            FenetrePrincipale(QWidget* widgetParent = 0)
            {
                this->setWindowTitle("Repére Orthogonal");
                this->setWindowIconText("icone.png");
                this->resize(400, 450);
     
                i = new Afficheur(this);
                m = new QGraphicsView(i, this);
                m->move((((this->width()) / 2) - ((m->width()) / 2)),
                        (((this->height()) / 2) - ((m->height()) / 2)));
                m->show();
     
                this->show();
            }
     
        protected:
            QGraphicsView* m;
            Afficheur* i;
     
            void resizeEvent(QResizeEvent* event)
            {
                m->move((((this->width()) / 2) - ((m->width()) / 2)),
                        (((this->height()) / 2) - ((m->height()) / 2)));
            }
     
    };
     
    #endif //HEADER__FenetrePrincipale
    Afficheur.hpp
    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
    /*!
     *GGFM = Générateur Graphique de Fonctions Mathématiques
     *License = BY-NC-SA (http://creativecommons.org/licenses/by-nc-sa/2.0/fr/)
     *Créateur = Abdelite
     *GGFM/Afficheur.hpp
     */
     
    #ifndef HEADER__Afficheur
    #define HEADER__Afficheur
     
    #include <QtCore>
    #include <QtGui>
    #include <QtGlobal>
     
    class Afficheur : public QGraphicsScene
    {
        Q_OBJECT
     
        public:
            Afficheur(QObject* objectParent = 0)
            {
                this->setSceneRect(0, 0, 100, 100);
                pointOriginRepereStandart = QPointF(0, 0);
                pointOriginRepereOrthogonal = QPointF(50, 50);
                QPoint kiko(0, 0);
                QPointF kiku(0, 4.5678);
                QLineF lino(this->returnPointOfRepereStandart(kiko),
                            this->returnPointOfRepereStandart(kiko));
                QLineF linu(this->returnPointOfRepereStandart(kiku),
                            this->returnPointOfRepereStandart(kiku));
                this->addLine(lino);
                this->addLine(linu);
            }
     
            QPointF returnPointOfRepereStandart(QPointF pointOfRepereOrthogonal)
            {
                return QPointF(
                    (pointOriginRepereOrthogonal.x() + pointOfRepereOrthogonal.x()),
                    (pointOriginRepereOrthogonal.y() - pointOfRepereOrthogonal.y()));
            }
     
            QPointF returnPointOfRepereOrthogonal(QPointF pointOfRepereStandart)
            {
                return QPointF(
                    (pointOfRepereStandart.x() - pointOriginRepereOrthogonal.x()),
                    (pointOriginRepereOrthogonal.y() - pointOfRepereStandart.y()));
            }
     
        protected:
            QPointF pointOriginRepereOrthogonal;
            QPointF pointOriginRepereStandart;
    };
     
    #endif //HEADER__Afficheur

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse, ça fonctionne, mais ce que je voudrais, c'est séparer prototypes et définitions dans un même fichier.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    il faut mettre les implémentations des fonctions directement dans la déclaration des classes et ne pas séparer :
    ou :

    Citation Envoyé par Abdelite Voir le message
    Merci pour ta réponse, ça fonctionne, mais ce que je voudrais, c'est séparer prototypes et définitions dans un même fichier.
    Comme tu l'as compris, la solution est le mot magique : inline ! Cf cette discussion.

  5. #5
    Invité
    Invité(e)
    Par défaut
    En effet ça marche belle est bien avec inline ^^
    Merci

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

Discussions similaires

  1. Code::Blocks ne veut pas compiler ?
    Par yapaf_oto dans le forum Code::Blocks
    Réponses: 5
    Dernier message: 04/02/2010, 07h24
  2. Réponses: 1
    Dernier message: 17/10/2007, 10h04
  3. Réponses: 3
    Dernier message: 27/02/2007, 14h02

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