fcoutel
Messages postés14Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention21 juillet 2006
-
30 août 2004 à 12:05
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 2004
-
1 sept. 2004 à 15:38
Bonjour!
Tout d'abord, Meme si j'uitlise OPENGL ce probleme n'a rien a voir avec OPENGL.
Dans le meme fichier GLObject.h j'ai mis:
/* OpenGL Material Description*/
struct Material {
Vec4D ambient; // Ambient material color
Vec4D diffuse; // Diffuse material color
Vec4D specular; // Specular material color
Vec4D emission; // Emissive material color
float shininess; // Specular shininess
};
class GLObject: public QObject
{
Q_OBJECT // must include this in order to use Qt signals/slots
protected:
Vec3D position; // object position
Material material[2]; // Front and back material properties
..
public :
/* default constructor */
GLObject();
...
/*Construct with specified origin, options and front and back materials*/
GLObject(Vec3D pos,uint opts,const Material& front,const Material& back);
...
/*Set material for specified side (where side = 0 or 1)*/
void setMaterial(int side,const Material &mtl);
/*Get material for specified side (where side = 0 or 1)*/
void getMaterial(int side,Material &mtl) const;
..
et dans GLObject.cpp j'ai
/* Construct with specified origin and options and material*/
GLObject::GLObject(Vec3D pos,uint opts,const Material& front,const Material& back){
position.x=pos.x;
position.y=pos.y;
position.z=pos.z;
material[0]=front;
material[1]=back;
bbox.lowleft.x=-1.0f;
bbox.lowleft.y=-1.0f;
bbox.lowleft.z=-1.0f;
bbox.upright.x= 1.0f;
bbox.upright.y= 1.0f;
bbox.upright.z= 1.0f;
options=opts;
selected=FALSE;
hidden=FALSE;
setName("GLObject");
}
/*Set material for specified side (where side = 0 or 1)*/
void setMaterial(int side,const Material& mtl) {
GLObject::material[0]=mtl;
}
/*Get material for specified side (where side = 0 or 1)*/
void getMaterial(int side,Material& mtl) {
mtl=material[side];
}
et au compilateur (SUnWSPRO 6) j'ai deux erreurs du type
"GLObject.cpp", line 107: Error: material is not defined.
Pourquoi la variable est declaree dans le contsructeur mais pas dans la function membre?
J'ai essaye de change protected en public meme resultat.
D1m3x
Messages postés402Date d'inscriptionsamedi 28 décembre 2002StatutMembreDernière intervention21 juillet 20051 30 août 2004 à 16:41
/*Set material for specified side (where side = 0 or 1)*/
void setMaterial(int side,const Material& mtl) {
GLObject::material[0]=mtl;
}
Cette fonctions est déclarée comme-ci elle n'appartenait pas à la classe, si tu veux implémentée celle définie dans la classe tu dois faire:
/*Set material for specified side (where side = 0 or 1)*/
void setMaterial(int side,const Material& mtl) {
material[0]=mtl;
}
Remarque que je ne met pas de GLObject:: devant le nom du membre, car ce n'est pas un membre statique!
Tu dois faire la même chose avec getMaterial, seulement ta façon de'implémenter une fonction get( ) est drôle, habituellement une fonction get est implémentée de cette façon:
Material GLObject::getMaterial( int side )
{
return material[ side ];
}
rien de plus simple =)
Je pense que l'erreur viennent du fait que tu implémente tes fonctions comme-ci elles ne faisaient pas parties de ta classe ;)
fcoutel
Messages postés14Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention21 juillet 2006 30 août 2004 à 17:24
Merci de vos reponses mais:
Dans mon premier post j'avais fais une erreur j'avais mis GLOBject::material mais comme tu l'as fais remarque ce n'est pas bon. La fonction qui donne l'erreur est bien celle ci-dessous
Pour getMaterial tu as raison mais elle n'etais pas finie..
J'ai contourner mon probleme en declarant une nouvelle classe Material et en implementant les memes fonctions mais bon j'aimerais savoir pourquoi une simple structure ne marche pas;.
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 31 août 2004 à 21:38
djl pitite kestion. si ton accesseur est defini ds le .h il est inline (ou jai rien compris audebat de lautre fois), alors comment tu fais pr dire "la met pas en inline"? et pk pas d'accesseurs inline?
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 1 sept. 2004 à 08:57
voila, si c'est dans la classe, ca l'est implicitement, sinon il faut specifier inline, mais jamais dans le .cpp (sinon ca sera pas inliner, du moins pour les autres modules compilés séparement)
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 1 sept. 2004 à 12:00
dc pr ke ca soit inline c'est a mettre ds un hpp......ou au pire un h en admettant que le compilo l'accepte et en admettant aussi que ca se fasse (puisque certains le prétendent...)
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 1 sept. 2004 à 12:07
enfin je veux dire.....si je fais ca :
#ifndef __TRUC_H__
#define __TRUC_H__
class Truc
{
public:
int f (int i);
};
#include Truc.hpp
#endif //__TRUC_H__
fichier hpp
#ifndef __TRUC_HPP__
#define __TRUC_HPP__
int Truc::f (int i)
{//traitements }
#endif //__TRUC_HPP__
la ma fonction est bien ds le header mais elle a pas directement ds la declaration de la classe. c'est inline ou pas? ou faut ke je mette mon corps direct ds le .h ds la declaration pr ke ca soit inline implicitement? (dsl fcoutel pr cette petite dérivation de sujet)
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 1 sept. 2004 à 13:20
oui et si le compilo accepte pas les corps de fonctions ds le header? et a priori on met pas de corps ds un .h......bon bref, je vais en fait continuer a mettre des inline explicites....ah oui, et si je fait tt comme un gros porc ds un seul fichier cpp, je declare ma classe ds mon fichier principal (et dc mes corps sont bien ds ma déclaration), c'est pas inline paske cest pas ds le header, ou cest inline paske cest ds la declaration de la classe?
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 1 sept. 2004 à 13:38
c'est juste une question de logique (comment est fais le shmilblik)
lorsque le compilateur compile un fichier source, si la fonction appelée est inline, il faut qu'elle soit definie à ce moment la (donc soit dans le fichier source, soit dans un des header appelés) pour que le compilateur puisse l'inliner (en gros remplacer l'appel par le code)
donc si ta fonction inline est definie dans le .cpp, elle sera inliner pour chaque appel se trouvant dans le meme source mais apres elle ne pourra plus etre inliner (sa seule declaration ne suffit pas)
c'est pour ca que les fonction inline doivent etre definie dans un header si tu veux qu'elle puisse etre inliner quelque soit le source