对象和指针的麻烦

时间:2009-12-08 19:33:36

标签: c++

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;

};

当它打印出闪耀时,我的值为零?那是为什么?

3 个答案:

答案 0 :(得分:2)

我认为object slicing发生了(因为你使用了Shape对象并分配给它)。为了保持多态性,您想要做的是使用指针或引用。在这种情况下,我会使用指针:

Shape *x = shapes[0];

如果形状是一个奇怪的容器,它取消引用(这是我从你的代码中理解的),那么我会使用一个引用:

Shape &x = shapes[0];

您可以使用const引用,但这里不是必需的,因为您的对象无论如何都不是临时的。

顺便说一句,没有人告诉过你全局变形是一种不好的做法吗?

答案 1 :(得分:2)

此代码无法编译。如果您为行{

}所暗示的Shape*定义了一个容器

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

然后,您无法从<{p>}中Shape检索shapes

Shape x = shapes[0];

答案 2 :(得分:0)

假设Shape是Sphere和其他人的基类,则不应复制它。目前,您(可能)通过制作其Shape基础部件的副本来切割实际上是Sphere的对象。

正如其他人所建议的,对Shape对象采用指针或引用应该可以解决您的问题。