2009-12-08 7 views
-1
vector < Shape* > shapes; 

void createScene() 
{ 

image = QImage(width, height, 32); // 32 Bit 
Color amb(0.1,0.1,0.1); 
Color difCoef(0.75,0.6,0.22); 
Color spec(0.5,0.5,0.5); 
double shine= 3.0; 
Sphere *s = new Sphere(Point(0.0,0.0,-5), 100.0, amb, difCoef, spec, shine); 
shapes.push_back(s); 

} 




int main(){ 

// initialize glut 
init(); 
createScene(); 
Shape *x = shapes[0]; 
cout << x->shine << endl; 
} 





class Shape 
{ 
public: 
Shape() {} 
~Shape(){} 
Color ambient; 
Color dif; 
Color spec; 
double shine; 
virtual bool checkIntersect(Point p, Point d, Point &temp) = 0; // If intersects, return true else false. 
virtual Point getNormal(Point intPt) = 0; // Get the normal at the point of intersection 
//virtual void printstuff() = 0; 

}; 

Lors de l'impression de la brillance, la valeur est-elle zéro? Pourquoi donc?Problème avec les objets et les pointeurs

+1

Je pense que vous devez fournir un peu plus de votre code .... – retracile

+4

où sont définies vos formes []? –

+0

De quelle bibliothèque est 'Shape'? Est-ce un cours que vous avez conçu ou qui vient d'une bibliothèque? –

Répondre

2

Je pense que object slicing apparaît (puisque vous utilisez un objet Shape et que vous lui attribuez). Ce que vous voudriez faire pour préserver le polymorphisme est d'utiliser un pointeur ou une référence. Dans ce cas, je voudrais utiliser un pointeur:

Shape *x = shapes[0]; 

Si des formes est un conteneur étrange qui fait de-référence (ce que je comprends de votre code) alors j'utiliser une référence:

Shape &x = shapes[0]; 

Vous pouvez utiliser une référence const, mais elle n'est pas obligatoire ici car votre objet n'est pas temporaire.

Btw, personne ne vous a dit que les globals sont une mauvaise pratique?

0

En supposant que Shape est une classe de base de Sphère et d'autres, vous ne devriez pas en faire une copie. Actuellement, vous coupez (probablement) l'objet qui est en fait une Sphère en faisant une copie de sa partie de base Forme. Prendre un pointeur ou une référence à l'objet Shape, comme d'autres l'ont suggéré, devrait résoudre votre problème.

2

Ce code ne peut pas être compilé. Si vous avez défini un conteneur pour Shape* comme le laisse entendre par les lignes

Sphere *s = new Sphere(Point(0.0,0.0,-5), 100.0, amb, difCoef, spec, shine); 
shapes.push_back(s); 

Ensuite, on ne pouvait pas être la récupération d'un Shape de shapes comme dans

Shape x = shapes[0]; 
+0

À moins qu'il n'utilise l'héritage public et ne coupe accidentellement son instance de Sphere dans une instance de Shape. –

+1

@Joe: Qu'est-ce que «l'inertie publique» a à faire? Dans le premier cas, il s'agit d'un conteneur de pointeurs, dans le second - des objets eux-mêmes. Le code de l'OP n'a aucun sens, comme l'a justement noté Dave. – AnT

+0

+1: Le code de l'OP ne devrait même pas compiler pour commencer –

Questions connexes