[C/C++][SFML] Quelques petites questions sur le C++ ...

Le côté programmation du développement d'un jeu vidéo.

Quelques petites questions sur le C++ ...

Messagepar AlastorS » 26 Fév 2010, 16:08

Bonjour bonjour ^^
Ca fait bien longtemps que je ne suis pas venu ici :00000020:

Mais bon ... ca fait plaisir de voir que y'a plein de nouveaux post :x ...
M'enfin je suis pas la non plus pour ca :)

Je voudrais savoir un truc déjà, qui me bloque que se soit dans mon jeux ( qui est en stand by ) mais aussi dans le projet que j'ai rejoints : ( tbt : http://www.towbowltactics.com/news.php ).

Bref je suis entrains d'ecrire un module GUI basé sur la SFML afin que lorsque je ne sois plus dispo ( ecole d'off Armé de l'air pour devenir pilote de chasse tout ca xD bientot ... ) il puisse continué a pousser ce module sans mon aide :).

Mais voilà j'avais un jolie schema tout ca mais, il viens de tombé a l'eau ( lol ) au bout de 20lignes a peu pres xD ...

En faite, ils travaillent sur une Base :
class SFMLApp - qui gère leur programme ...
Et moi je veux imbriqué dedans une :
class SFMLGui - avec un constructeur SFMLGui( SFMLApp* parent, bool display ),
Ici le seul argument qui interesse mon fameux problème est le 1er :/

Et dans cette class SFMLApp ils ont une fonction StopApp() ...
Donc mon but c'est d'atteindre cette fonction depuis ma class via un _parent->StopApp() et j'obtiens une erreur :) ...

Je vous mets la partie du code qui marche pas ^^ : http://pastebin.com/arfwzPhE
Erreur est la suivante :
Code: Tout sélectionner
-------------- Build: Debug in 1 ---------------

Compiling: SFMLGui.cpp
C:\Users\Alastor\Documents\CodeBlock\Projet tbt\1\SFMLGui.cpp: In member function `void SFMLGui::Break()':
C:\Users\Alastor\Documents\CodeBlock\Projet tbt\1\SFMLGui.cpp:38: error: invalid use of undefined type `struct SFMLApp'
C:\Users\Alastor\Documents\CodeBlock\Projet tbt\1\SFMLGui.hpp:11: error: forward declaration of `struct SFMLApp'
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warnings
Avatar de l’utilisateur
AlastorS
Hello World, I'm new !
 
Messages: 43
Inscription: 12 Oct 2009, 18:17

Messagepar valentin » 26 Fév 2010, 16:24

bah ah priori il ne trouve pas la définition de la class SFMLApp,
hmmm bah rajoute l'header où il est défini, ça sera le plus simple je pense...
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar AlastorS » 26 Fév 2010, 16:41

Ba si j'include j'aurais pas un prob de réinclusion non ??
( la class SFMLApp a un SFMLGui en private :/ .... )


J'essaye quand meme :/ ...
Avatar de l’utilisateur
AlastorS
Hello World, I'm new !
 
Messages: 43
Inscription: 12 Oct 2009, 18:17

Messagepar AlastorS » 26 Fév 2010, 16:49

Bon voila j'ai mis le code de SFMLApp ... enfin le miens eux ils auront qu'a rajouté leurs partis ^^

http://pastebin.com/d34M0ix1

Et quand j'inclus SFMLApp.hpp ca me dit ca :/

Code: Tout sélectionner
-------------- Build: Debug in 1 ---------------

Compiling: SFMLGui.cpp
In file included from C:\Users\Alastor\Documents\CodeBlock\Projet tbt\1\SFMLGui.hpp:11,
                 from C:\Users\Alastor\Documents\CodeBlock\Projet tbt\1\SFMLGui.cpp:2:
C:\Users\Alastor\Documents\CodeBlock\Projet tbt\1\SFMLApp.hpp:25: error: ISO C++ forbids declaration of `SFMLGui' with no type
C:\Users\Alastor\Documents\CodeBlock\Projet tbt\1\SFMLApp.hpp:25: error: expected `;' before '*' token
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 0 warnings
 
Avatar de l’utilisateur
AlastorS
Hello World, I'm new !
 
Messages: 43
Inscription: 12 Oct 2009, 18:17

Messagepar valentin » 26 Fév 2010, 16:52

Alors effectivement, ça ne marchera pas...

je pense que l'architecture est à revoir...
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar AlastorS » 26 Fév 2010, 16:59

Un piti conseil ?? :/ ??
Avatar de l’utilisateur
AlastorS
Hello World, I'm new !
 
Messages: 43
Inscription: 12 Oct 2009, 18:17

Messagepar valentin » 26 Fév 2010, 17:00

Plus simplement ta class SFMLGui pourrait agir sur un booléen (static ou non) initialisé à:

bool b_AppStop = false;

celui si est mis à "true" dans ta fonction break de SFMLGui
et dans ta boucle (en dehors de la classe SFMLGui) tu met le test:

if(b_AppStop)pApp->StopApp();

et au lieu de rentrer un SFMLApp* dans le constructeur tu te contentes d'un bool*
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar AlastorS » 26 Fév 2010, 17:08

Mouai cette manière j'aurais pu, mais je voulais faire un truc qui agit directement sur la classe qui la class parent ...

M'enfin je vais faire ca :/ ...
A moins que quelqu'un m'explique :x ...
Avatar de l’utilisateur
AlastorS
Hello World, I'm new !
 
Messages: 43
Inscription: 12 Oct 2009, 18:17

Messagepar valentin » 26 Fév 2010, 17:17

Ce contexte ne me parait pas approprié,
Généralement qd on a des paramètres parent ou child, ce sont des pointeur venant d'une class mère dont toutes les autres héritent, dans ce cas il est utile d'avoir ce genre de pointeur.

Mais dans tout les cas leur utilisation au sein d'une class, n'excède pas l'accesseur, ou l'utilisation de méthode cette class mère.

C'est moins simple avis
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar NewbiZ » 26 Fév 2010, 17:44

Il faut différencier une dépendance forte et une dépendance faible (http://www.amazon.fr/gp/product/toc/0201633620/ref=dp_toc?ie=UTF8&n=52042011)

(PS: J'agrège plus loin compilateur et éditeur de lien pour que ce soit plus simple à expliquer)

Lorsque tu déclare un pointeur vers une classe, le compilateur n'a pas besoin d'autre chose que d'une forward déclaration. Un pointeur c'est un pointeur, a priori sa taille est fixe (sauf pour les pointeurs de méthodes, mais ca n'a pas d'importance ici).

En revanche lorsque tu utilise ce pointeur (méthode/attributs), le compilateur a besoin de connaitre la déclaration complète de la classe, pour pouvoir, par exemple, connaitre l'offset d'un attribut lorsque tu l'utilise.

Le premier cas est une dépendance faible, le second une dépendance forte.
La dépendance faible se résoud par une forward declaration, la dépendance forte pas une déclaration complète (include).

Dans ton cas, le compilateur se plaint parceque lorsque tu fais
Code: Tout sélectionner
_parent->stopApp();
il ne connait que la forward déclaration de SFMLApp que tu as faite dans le header de SFMLGui. A partir de cette forward déclaration, il ne sait absolument pas si l'appel est correct, si cette méthode existe, et quelle est son adresse.

Il te faut donc forward déclarer SFMLApp dans SFMLGui.h, et inclure SFMLApp.h dans SFMLGui.cpp.

Il en va de même pour FSMLApp:
Il te faut forward déclarer SFMLGui dans SFMLApp.h et non pas l'inclure (et puisqu'apparement tu n'utilise pas SFMLGui dans SFMLApp.cpp, même pas besoin d'inclure SFMLGui.h)

En espérant que ca clarifiera les choses.

Bon courage et bonne continuation :-)
~ Passer pour un idiot aux yeux d'un imbécile est une volupté de fin gourmet ~
Avatar de l’utilisateur
NewbiZ
 
Messages: 1265
Inscription: 02 Juin 2005, 22:25
Localisation: Tallinn / Estonie

Messagepar AlastorS » 26 Fév 2010, 18:28

Je pense avoir saisie de quoi tu parle apres de la a mettre en application :x ...

J'ai déjà rencontrer le même probleme dans l'ossature de jeux que j'avais commencé dans le but d'utilisé mon Moteur3D ... ( qui n'est pas finit loin de la :x ... )
Hors j'ai laissé tombé ... et ai mis ca de coté ...

Bref si tu pourrais me réalisé un petit exemple avec deux class standard ... ca serais super cool :)

BIG edit :NewBiz merci beaucoup j'ai reussi ;) ...

Je repasserais si je rencontre d'autre difficulté :x ...

Merci de vos reponse.
Avatar de l’utilisateur
AlastorS
Hello World, I'm new !
 
Messages: 43
Inscription: 12 Oct 2009, 18:17


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 19 invités