Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/11/2008, à 23:07

katian

[RESOLU] c++ heritage & co...

salut !

j'ai un fichier ZFenPrincipale.h comme ceci :

#include <QWidget>

class ZFenPrincipale : public QWidget
{
};

dans un autre fichier si je fait :

#include <QWidget>
class test
{
QWidget *m_fenetre;
}

ca compile

par contre

#include "ZFenPrincipale.h"
class test
{
ZFenPrincipale *m_fenetre;
}

ca ne compile pas (erreur: ISO C++ forbids declaration of ‘ZFenPrincipale’ with no type)

pourquoi ? merci !

Dernière modification par katian (Le 23/11/2008, à 00:54)

Hors ligne

#2 Le 22/11/2008, à 23:10

valAa

Re : [RESOLU] c++ heritage & co...

salut,

si ZFenPrincipale est dans le dossier de ton projet, il faut écrire

#include "ZFenPrincipale.h"

la notation

#include <truc>

va chercher dans le $PATH, pas dans le dossier ou à lieu la compilation.

Hors ligne

#3 Le 22/11/2008, à 23:14

katian

Re : [RESOLU] c++ heritage & co...

merci pour l'indication mais mon message est incorrect j'ai plutot dans mon fichier :


#include "ZFenPrincipale.h"
class test
{
ZFenPrincipale *m_fenetre;
}

désolé

Donc je ne comprends pas...........

Hors ligne

#4 Le 22/11/2008, à 23:47

Link31

Re : [RESOLU] c++ heritage & co...

Précise un peu : je pense que tu as d'autres erreurs, et que les exemples de ton premier post ne sont pas complets. Vérifie aussi que tu as bien un point virgule à la fin de chacune de tes classes wink

Hors ligne

#5 Le 23/11/2008, à 00:28

katian

Re : [RESOLU] c++ heritage & co...

main.cpp

#include <QApplication>
#include <iostream>

#include "ZFenPrincipale.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

ZFenPrincipale fenetre;
fenetre.show();

return app.exec();
};

ZFenPrincipale.h

#ifndef ZFENPRINCIPALE_H_INCLUDED
#define ZFENPRINCIPALE_H_INCLUDED

#include <QWidget>
#include "ZMonde.h"

class ZFenPrincipale : public QWidget
{
    Q_OBJECT

    public:
        ZFenPrincipale();
        ~ZFenPrincipale();
        void affiche_point(); // Affichage d'un point

    private slots:
        void step();

    private:
        ZMonde *m_monde; // Monde
};

#endif // ZFENPRINCIPALE_H_INCLUDED

ZMonde.h

#ifndef ZMONDE_H_INCLUDED
#define ZMONDE_H_INCLUDED

#include <QWidget>
#include <QList>

#include "ZFenPrincipale.h"
#include "Zterrain.h"
#include "ZObjet.h"

class ZMonde
{
    public:
        ZMonde(QWidget *);
        ZMonde(ZFenPrincipale *);
        ~ZMonde();
        void step();

    private:
        void affiche();

        QWidget *m_fenetre_mere;
        ZFenPrincipale *m_fenetre;
        Zterrain *m_terrain;
        QList <ZObjet *> m_fourmis;
};

#endif // ZMONDE_H_INCLUDED

Compilation :

In file included from src/ZFenPrincipale.h:5,
                 from src/main.cpp:22:
src/ZMonde.h:15: erreur: expected `)' before ‘*’ token
src/ZMonde.h:23: erreur: ISO C++ forbids declaration of ‘ZFenPrincipale’ with no type
src/ZMonde.h:23: erreur: expected ‘;’ before ‘*’ token
make: *** [main.o] Erreur 1

Hors ligne

#6 Le 23/11/2008, à 00:36

dekans

Re : [RESOLU] c++ heritage & co...

ZFenPrincipale fenetre = new ZFenPrincipale();

C'est pas mieux comme ça ?

Dernière modification par dekans (Le 23/11/2008, à 00:37)


dekans@jabber.kubuntu-fr.org

Hors ligne

#7 Le 23/11/2008, à 00:41

valAa

Re : [RESOLU] c++ heritage & co...

dekans a écrit :
ZFenPrincipale fenetre = new ZFenPrincipale();

C'est pas mieux comme ça ?

euh... en java peut-être ? neutral

Hors ligne

#8 Le 23/11/2008, à 00:48

Link31

Re : [RESOLU] c++ heritage & co...

Je m'y attendais : une inclusion récursive wink

Il te suffit de mettre class ZFenPrincipale; à la place de #include "ZFenPrincipale.h" dans ZMonde.h, ou de mettre class ZMonde; à la place de #include "ZMonde.h" dans ZFenPrincipale.h.

À noter : une déclaration anticipée telle que class ZFenPrincipale; ne permet que d'utiliser le type en question (ZFenPrincipale) comme pointeur ou référence, pas en tant que variable membre ou classe parente.

Dans ton cas, tu n'utilises que des pointeurs, donc c'est bon. Mais il faut malgré tout inclure le .h quand tu utilises effectivement le pointeur, c'est-à-dire dans le .cpp.

Dernière modification par Link31 (Le 23/11/2008, à 00:53)

Hors ligne

#9 Le 23/11/2008, à 00:49

katian

Re : [RESOLU] c++ heritage & co...

une partie du ZFenPrincipale.cpp

#include <QWidget>

#include "ZFenPrincipale.h"

/*****************************
Constructeur
******************************/
ZFenPrincipale::ZFenPrincipale() : QWidget()
{
// Définition de quelques propriétés de la fenêtre
    setMinimumSize(500, 350);
    setWindowTitle(tr("Fourmis"));

// Creation du monde
    m_monde = new ZMonde(this);

// Démarrage du timer de mise a jour de la fenetre
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(step()));
    timer->start(1000);
};

Hors ligne

#10 Le 23/11/2008, à 00:52

obiwankennedy

Re : [RESOLU] c++ heritage & co...

je ne pense pas que ça règlera ton pb mais
modifie ton constructeur de ZFenPrincipale
en ajoutant un ZFenPrincipale(QWidget* parent = 0)

et je pense que tu as un problème de références croisées

Ton Zmonde a besoin de ZFenPrinciapale et ZFenPrincipale a besoin de ZMonde.

Essaie de rajouter "class ZFenPrincipale"
dans ta .h de monde comme ceci

#ifndef ZMONDE_H_INCLUDED
#define ZMONDE_H_INCLUDED

#include <QWidget>
#include <QList>

#include "ZFenPrincipale.h"
#include "Zterrain.h"
#include "ZObjet.h"

class ZFenPrincipale;

class ZMonde
{
    public:
        ZMonde(QWidget *);
        ZMonde(ZFenPrincipale *);
        ~ZMonde();
        void step();

    private:
        void affiche();

        QWidget *m_fenetre_mere;
        ZFenPrincipale *m_fenetre;
        Zterrain *m_terrain;
        QList <ZObjet *> m_fourmis;
};

#endif // ZMONDE_H_INCLUDED

Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam

Hors ligne

#11 Le 23/11/2008, à 00:54

katian

Re : [RESOLU] c++ heritage & co...

Link31 a écrit :

Je m'y attendais : une inclusion récursive wink

Il te suffit de mettre class ZFenPrincipale; à la place de #include "ZFenPrincipale.h" dans ZMonde.h, ou de mettre class ZMonde; à la place de #include "ZMonde.h" dans ZFenPrincipale.h.

À noter : une déclaration anticipée telle que class ZFenPrincipale; ne permet que d'utiliser le type en question (ZFenPrincipale) comme pointeur ou référence, pas en tant que variable membre ou classe parente.
Dans ton cas, tu n'utilises que des pointeurs, donc c'est bon.

J'ai pigé ! ca marche ! merci beaucoup ! big_smile:D

Hors ligne

#12 Le 23/11/2008, à 11:13

dekans

Re : [RESOLU] c++ heritage & co...

valAa : Effectivement, hmm

Je devais être fatigué -_-'


dekans@jabber.kubuntu-fr.org

Hors ligne