如何在c ++中正确访问继承的方法和构造函数?

时间:2013-02-06 10:36:58

标签: c++ inheritance constructor

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

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

如果这是一个明显明显的答案我很抱歉,但我是C ++的新手并且正在努力应对转型。如果我遗漏了任何重要信息,请随时告诉我。以下是相关代码:

MAIN

#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;

}

Point.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.

Point.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 */

Sphere.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.

Sphere.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 个答案:

答案 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) { }

如果centerPoint的{​​{1}}数据成员,那么您应该更喜欢构造函数初始化列表中的初始化,而不是构造函数体中的赋值:

Sphere

我在声明中编辑了冒号,但至少需要6个字符。

答案 2 :(得分: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成员变量。

答案 3 :(得分:0)

正如其他人所说,你应该确切地说明Sphere与Point的关系如何(Sphere有一个Point即成员,或者Sphere是一个Point,即继承)。

你的确切问题是:

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

也就是说,setCenter()更新与getX / Y / Z()无关的内容。