我有一个Sphere类,它继承了Center的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;
}
#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.
#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 */
#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.
#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
答案 0 :(得分:3)
class Sphere: public Point {
这表示Sphere 是一个Point,它以Point所拥有的一切开始,包括X,Y和Z坐标。
private:
Point center; // center of sphere
这表示Sphere 有一个点,称为center
。这个点,一个球体也有一个X,Y和Z坐标,就像所有的点一样。
所以一个球体都是一个Point并且有一个Point,每个都有一个X,Y和Z坐标。这可能不是您想要的,当您设置这两个点中的一个然后获得另一个时,您的代码会失败。选择一个模型并坚持下去。
如果你需要像点一样多态地处理一个球体,那么删除center
- 在这个模型中,球体是一个也有半径的点。如果你不需要像点一样处理一个球体,那么就不要从Point继承 - 在这个模型中,一个球体不是一个点,而是一个点和一个半径。
答案 1 :(得分:2)
您的Point
2和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
的{{1}}数据成员,那么您应该更喜欢构造函数初始化列表中的初始化,而不是构造函数体中的赋值:
Sphere
我在声明中编辑了冒号,但至少需要6个字符。
答案 2 :(得分:1)
您没有说明Point
和Sphere
的关联方式,但我猜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
成员变量。
答案 3 :(得分:0)
正如其他人所说,你应该确切地说明Sphere与Point的关系如何(Sphere有一个Point即成员,或者Sphere是一个Point,即继承)。
你的确切问题是:
也就是说,setCenter()更新与getX / Y / Z()无关的内容。