0

我有一个 Sphere 类,它继承了一个 Point 对象作为中心。当我通过 Sphere 构造函数创建一个 Sphere 对象时,它总是将中心初始化为 0,0,0,但它会正确设置半径。

访问 Sphere 的 setCenter() 方法也没有影响。我可以有效地改变球体中心点的 X、Y、Z 坐标的唯一方法是调用 Point 的 setX() 等方法。

如果这是一个明显的答案,我深表歉意,但我是 C++ 新手,正在为过渡而苦苦挣扎。如果我遗漏了任何重要信息,请随时告诉我。以下是相关代码:

主要的

#include <iostream>
#include <fstream>
#include "MovingSphere.h"

using namespace std;

int main() {

    ifstream inFile("sphere.txt");
    int X, Y, Z, R, DX, DY, DZ;
    if (inFile) {

        inFile >> X >> Y >> Z >> R
            >> DX >> DY >> DZ;
    }
    else {
        cerr << "\neRR: Cannot find input file.\n\n";
    }

    // create a sphere
    Sphere sphereInstance(X, Y, Z, R);
    sphereInstance.setCenter(1, 2, 3);
    sphereInstance.setX(3);

    cout << endl <<
        "X = " << sphereInstance.getX() << endl <<
        "Y = " << sphereInstance.getY() << endl <<
        "Z = " << sphereInstance.getZ() << endl;

return 0;

}

点.cpp

#include "Point.h"

Point::Point() : x(0), y(0), z(0) {   // default constructor (point at 0,0,0)
}

Point::Point(int X, int Y) : x(), y(), z(0) {      // constructor for 2d point
}

Point::Point(int X, int Y, int Z) : x(), y(), z() { // constructor for 3d point
}

// set the points X coordinate (mutator)
void Point::setX(int newX) {
    x = newX;
}
... etc.

点.h

#ifndef POINT_H
#define POINT_H

class Point {

public:
    Point ();                         // default constructor (0,0,0);
    Point(int X, int Y);              // constructor for 2d point
    Point(int X, int Y, int Z);       // constructor for 3d point

    void setX(int newX);              // declaration

    int getX() const;                 // declaration
etc...


private:

    int x, y, z;  // coordinates of point

};

#endif  /* POINT_H */

球体.cpp

#define _USE_MATH_DEFINES
#include <math.h>
#include "Sphere.h"

Sphere::Sphere() : 
    center(), radius(0) {// default constructor (a point at 0,0,0)
}

Sphere::Sphere(int X, int Y, int Z, int R) {     // sphere constructor
    center = Point(X, Y, Z);
    radius = R;
}

// set the sphere's center (mutator)
void Sphere::setCenter(int X, int Y, int Z) {
    center.setX(X);
    center.setY(Y);
    center.setZ(Z);
}
... etc.

球体.h

#ifndef SPHERE_H
#define SPHERE_H

#include "Point.h"

class Sphere: public Point {

public:
    Sphere();          // default constructor (a point at 0,0,0)
    Sphere (int X, int Y, int Z, int R); // sphere constructor

    void setRadius(int newRadius); // declaration
    void setCenter(int X, int Y, int Z); // declaration

    int getRadius() const;         // declaration

private:
    Point center;      // center of sphere
    int radius;        // radius of sphere

};

#endif  /* SPHERE_H */

输出

X = 3
Y = 0
Z = 0
4

4 回答 4

3
class Sphere: public Point {

这表示一个球体一个点,并从一个点所具有的一切开始,包括 X、Y 和 Z 坐标。

private:
   Point center;      // center of sphere

这表示一个球体一个点,称为center。一个球体的这个点也有一个 X、Y 和 Z 坐标,就像所有的点一样。

所以一个球体既是一个点又是一个点,每个点都有一个 X、Y 和 Z 坐标。这不可能是您想要的,并且您的代码在设置这两个点之一然后获取另一个点时会失败。选择一个模型并坚持下去。

如果您需要多态地将球体视为点,则删除center- 在此模型中,球体是也具有半径的点。如果您不需要将球体视为点,则不要从点继承——在此模型中,球体不是点,而是具有点和半径。

于 2013-02-06T10:56:07.423 回答
2

您的Point2 和 3 参数构造函数对输入不执行任何操作。将它们更改为

Point::Point(int X, int Y) : x(X), y(Y), z(0) { }

Point::Point(int X, int Y, int Z) : x(X), y(X), z(Z) { }

如果center是 的Point数据成员Sphere,那么您应该更喜欢在构造函数初始化列表中进行初始化,而不是在构造函数主体中进行赋值:

Sphere::Sphere(int X, int Y, int Z, int R) : center(X,Y,Z), radius(R) { }

我在语句中编辑了一个冒号,但至少需要 6 个字符。

于 2013-02-06T10:41:48.457 回答
1

你没有展示如何PointSphere相关,但我想这Sphere继承自Point......

class Point
{
    ...
};

class Sphere : public Point
{
    ...
};

如果你想调用例如基本构造函数,你可以在初始化列表中执行它:

Sphere::Sphere(int X, int Y, int Z, int R)
    : Point(X, Y, Z), radius(R)
{
}

至于其他函数,如果它们在基类中,您可以将它们用作子类的成员:

void Sphere::setCenter(int X, int Y, int Z)
{
    setX(X);
    setY(Y);
    setZ(Z);
}

由于Sphere也是Point(由于继承)您不需要center成员变量。

于 2013-02-06T10:41:41.350 回答
0

正如其他人所说,您应该首先明确 Sphere 与 Point 的关系(Sphere has-a Point 即成员,或 Sphere is-a Point 即继承)。

但是,您的确切问题是:

  • Sphere 的 setCenter() 方法更新 Sphere::center
  • Sphere 使用 Point 的 getX/Y/Z(),这些使用 Point 中的 x/y/z

即 setCenter() 更新与 getX/Y/Z() 无关的东西。

于 2013-02-06T11:01:46.303 回答