关于指针和对象的问题

时间:2009-12-08 22:16:14

标签: c++

我的最后一个问题是一团糟。我得错了输出。

所以我的主要内容是:

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 shineExp = 3.0;
Sphere *s = new Sphere(Point(0.0,0.0,-5), 100.0, amb, difCoef, spec, shineExp);
shapes.push_back(s);

其中形状是矢量<形状*>形状;

Shape *x = shapes[0];
cout << "Shine" << x->shine << endl;

即使答案应为3.0,也要打印零。

以下是我的课程:

#include "shape.h"
class Sphere : public Shape
{
    public:
    Point centerPt;
    double radius;
    Color ambient;
    Color dif;
    Color spec;
    double shine;

    Sphere(Point center, double rad, Color amb, Color difCoef, Color specu, double shineVal)
    {
        centerPt = center;
        radius = rad;
        ambient = amb;
        dif = difCoef;
        spec = specu;
        shine = shineVal;
    }

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 :(得分:6)

问题在于您在派生类中重复变量声明。您无需在派生类double shine中重新声明Shape中已存在于Sphere中的变量。由于Sphere继承自ShapeShape中的所有公共成员变量都会自动在Sphere中继承,并且不需要重新声明。重新声明它们将导致两个不同的成员变量,即Sphere::shine是与Shape::shine完全不同的变量。

因此,当您为Sphere::shine分配值,然后稍后使用基类Sphere指针访问Shape的实例时,shine的值为不会是你期望的。

答案 1 :(得分:1)

Sphere的每个实例都有两个名为shine的变量。一个在派生类中,一个在基类中。

Sphere构造函数初始化派生的Sphere::shine,但x->shine访问基类变量,因为x的类型为“Shape的指针”。成员变量没有任何“虚拟”行为。

我几乎可以肯定你想要的是将公共变量保存在基类Shape中,而不是重新声明相同的命名并在派生类中键入成员变量。您应该只声​​明派生类中派生类的唯一属性(例如centerPt的{​​{1}}和radius)。

答案 2 :(得分:1)

您不应在shine

中重新定义Sphere成员