C++ 对象和指针有问题 vector形状; void createScene() { image=QImage(宽度,高度,32);//32位 彩色电磁轴承(0.1,0.1,0.1); 色差(0.75,0.6,0.22); 颜色规格(0.5,0.5,0.5); 双光=3.0; Sphere*s=新球体(点(0.0,0.0,-5),100.0,amb,difCoef,等级库,光泽); 形状。向后推; } int main(){ //初始化过剩 init(); createScene(); 形状*x=形状[0]; cout shine

C++ 对象和指针有问题 vector形状; void createScene() { image=QImage(宽度,高度,32);//32位 彩色电磁轴承(0.1,0.1,0.1); 色差(0.75,0.6,0.22); 颜色规格(0.5,0.5,0.5); 双光=3.0; Sphere*s=新球体(点(0.0,0.0,-5),100.0,amb,difCoef,等级库,光泽); 形状。向后推; } int main(){ //初始化过剩 init(); createScene(); 形状*x=形状[0]; cout shine,c++,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); doubl

我认为会发生(因为您正在使用一个形状对象并将其赋值)。为了保留多态性,您需要使用指针或引用。在这种情况下,我将使用指针:

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;

};
如果形状是一个不进行反引用的奇怪容器(这是我从您的代码中理解的),那么我将使用一个引用:

Shape *x = shapes[0];
您可以使用const引用,但这里不强制使用,因为您的对象无论如何都不是临时对象


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

假设形状是球体和其他物体的基类,你不应该复制它。目前,你(可能)正在通过复制形状的基础部分来切割实际上是球体的物体


按照其他人的建议,使用指向形状对象的指针或引用可以解决您的问题。

此代码无法编译。如果您已按照行中的暗示为
Shape*
定义了容器,则

Shape &x = shapes[0];
然后,您无法从
形状
中检索
形状
,如中所示

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

我认为您需要提供更多的代码…shapes[]在哪里定义?Shape来自哪个库?它是您设计的类还是来自库?Color amb(0.1,0.1,0.1);不是声明新对象并将值传递给构造函数的方法。您需要Color*amb=new Color(.1,.1,.1);您的代码毫无意义。您将指针推入容器
形状
。您正在从容器中检索对象值。如果您使用的是标准容器,则无法也不会编译。如果您使用的是一些奇怪的自制容器,您必须告诉我们它是什么。如果没有有关
形状的详细信息,则有关于你的问题,没有任何有意义的说法。除非他在使用公共继承,并且不小心将他的球体实例分割成了一个形状实例。@Joe:“公共继承”是什么意思有什么关系吗?在第一种情况下,它是指针的容器,在第二种情况下是对象本身的容器。正如Dave正确指出的那样,OP的代码没有任何意义。它可能是某个自定义容器在幕后进行反引用。但是,如果提供的代码没有编译,我不会感到惊讶。我的答案涵盖了这两种情况。
Shape x = shapes[0];