Pages : 1
#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
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...
ZFenPrincipale fenetre = new ZFenPrincipale();
C'est pas mieux comme ça ?
euh... en java peut-être ?
Hors ligne
#8 Le 23/11/2008, à 00:48
- Link31
Re : [RESOLU] c++ heritage & co...
Je m'y attendais : une inclusion récursive
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...
Je m'y attendais : une inclusion récursive
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 ! :D
Hors ligne
#12 Le 23/11/2008, à 11:13
- dekans
Re : [RESOLU] c++ heritage & co...
valAa : Effectivement,
Je devais être fatigué -_-'
dekans@jabber.kubuntu-fr.org
Hors ligne
Pages : 1