0

中心のPointオブジェクトを継承するSphereクラスがあります。Sphereコンストラクターを使用してSphereオブジェクトを作成すると、常に中心が0,0,0に初期化されますが、半径は正しく設定されます。

SphereのsetCenter()メソッドにアクセスしても影響はありません。球の中心点のX、Y、Z座標を効果的に変更できる唯一の方法は、点の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;

}

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

4 に答える 4

3
class Sphere: public Point {

これは、球ポイントであり、X、Y、Z座標など、ポイントが持つすべてのものから始まることを意味します。

private:
   Point center;      // center of sphere

これは、球にはと呼ばれるポイントがあることを示していcenterます。球が持つこのポイントには、すべてのポイントと同様に、X、Y、およびZ座標もあります。

したがって、球は両方とも点であり、それぞれがX、Y、およびZ座標を持つ点を持っています。これはあなたが望むものではありえません、そしてそれがこれらの2つのポイントの1つを設定しそして次に他を得るときあなたのコードは失敗します..1つのモデルを選んでそれに固執してください。

球を点のように多形的に扱う必要がある場合は、削除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

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

于 2013-02-06T10:41:41.350 に答える
0

他の人が言っているように、最初にSphereがPointにどのように関連しているかを正確に明確にする必要があります(SphereにはPoint、つまりメンバー、またはSphereにはPoint、つまり継承があります)。

ただし、正確な問題は次のとおりです。

  • SphereのsetCenter()メソッドはSphere::centerを更新します
  • SphereはPointのgetX/Y / Z()を使用し、これらはPointのx / y/zを使用します

つまり、setCenter()は、getX / Y / Z()とは関係のないものを更新します。

于 2013-02-06T11:01:46.303 に答える