Probleme avec structure utilisee dans une classe

fcoutel Messages postés 14 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 21 juillet 2006 - 30 août 2004 à 12:05
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 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.

MERCI!

18 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
30 août 2004 à 14:31
"GLObject.cpp", line 107: Error: material is not defined.

et c'est quoi l'erreur dans le fichier header ?
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
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 ;)

Ciao...

:.: [DmXx] [[irc://irc.quakenet.org/ex-concept #eX-Concept @ QNet]] :.:
0
fcoutel Messages postés 14 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 21 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

void setMaterial(int side,const Material& mtl) {
material[0]=mtl;
}



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;.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
30 août 2004 à 18:33
ta fonction doit etre membre de ta classe, et evite les parametres inutilent

et surtout les acsesseurs INLINE !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
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?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 août 2004 à 23:04
il faut que ce soit dans la declaration de la classe

en gros pour qu'un accesseur soit inline, il y a 2 facons

struct Foo
{

int x;
...
int getX() const
{ return x; }

};

ou

struct Foo
{
int x;
...
inline int getX() const;
};

inline int Foo::getX() const
{
return getX();
}

dans tout les cas ca doit etre dans un fichier header (jamais compilé separement)
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
1 sept. 2004 à 00:21
ah ok....javais capté de travers...javais compris que
.h

type f (type);

.cpp

type f (type t)
{instructions;}

ca mettait inline...alors ke la si jai capté cest si corps directement ds la declaration, la cest inline. cest ca?
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
1 sept. 2004 à 00:22
enfin tt ca ds une classe
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
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)
0
fcoutel Messages postés 14 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 21 juillet 2006
1 sept. 2004 à 09:06
Je ne sais pas comment le sujet a derive vers inline cqr je n'utilise pas ca..

J'ai trouve le probleme: si je declare une fonction membre dans le .h
void setMaterial(int side,const Material &mtl);


et je l'implemente dans le .cpp

void setMaterial(int side,const Material& mtl) {
GLObject::material[0]=mtl;
}


Mon compilateur donne une erreur. Par contre si le declare la fonction dans le .h comme ca ca marche:
void setMaterial(int ,const Material&);


Merci pour votre aide.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
1 sept. 2004 à 10:23
hors de la classe, pour definir ta fonction membre tu devrais faire

void GLObject::setMaterial(int side,const Material& mtl) {
material[0]=mtl;
}
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
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...)
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
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)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
1 sept. 2004 à 13:03
non, la ca sera pas inline, pour que ce soit implicitement inline, il faut que tu definisses la fonction dans la declaration de la classe

par exemple

// dans un fichier header

struct Foo
{
// bar sera implicitement inliner
void bar() { ... };

void bar2();
};

// bar2 n'est pas inline
void Foo::bar2()
{
...
}
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
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?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
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

tu vois ?
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
1 sept. 2004 à 14:05
vi la logique du inline je connais, pas de pb, cetait juste de savoir la regle pr impliciter. cest bon la jai capté...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
1 sept. 2004 à 15:38
au pir si tu doute sort le listing asm
0
Rejoignez-nous