0

リンクリストにMovingSphereオブジェクトを保存しています。MovingSphereはSphereを継承します。球は、空白で区切られた整数のテキストファイルから読み取ることによって初期化されます。

球の半径にアクセスすると、適切な数値が返されますが、X、Y、Z座標を取得しようとすると、NANが返されます。NetBeansデバッガを介して実行しようとしましたが、役立つ情報をあまり収集できませんでした。適切な値が保存されていることはわかっていますが、これらの座標に適切にアクセスできない理由がわかりません。

私はまだJavaからC++へのスワップに苦労しているので、これは明らかに明らかな問題であることを許してください。

主要

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


using namespace std;


typedef list<MovingSphere>::iterator iter;
static double INCREMENT = .01; // time increment
static int CUBE_SIZE = 1000; // distance across any given cube wall
int main() {

    ifstream inFile("sphere.txt");
    double X, Y, Z;
    int R, DX, DY, DZ;
    list<MovingSphere> sphereList;
    MovingSphere msInstance;

    iter it = sphereList.begin();

    // populate SphereList
    if (inFile) {  // If file is not empty.
        while (inFile >> X >> Y >> Z >> R >> DX >> DY >> DZ) {
            // create sphere
            msInstance = MovingSphere(X, Y, Z, R, DX, DY, DZ);
                        cout << endl <<
            "X = " << msInstance.getCenterX() << endl <<
            "Y = " << msInstance.getCenterY() << endl <<
            "Z = " << msInstance.getCenterZ() << endl <<
            "R = " << msInstance.getRadius() << endl <<
            "DX = " << msInstance.getDX() << endl <<
            "DY = " << msInstance.getDY() << endl <<
            "DZ = " << msInstance.getDZ() << endl;                    

            sphereList.insert(it, msInstance);
            ++it;

        } // end while
    } // end if

    return 0;
}

MovingSphere.h

#ifndef MOVINGSPHERE_H
#define MOVINGSPHERE_H

#include "Sphere.h"

class MovingSphere : public Sphere {
public:
    MovingSphere();                     // default constructor
    MovingSphere(double X, double Y, double Z, int R);     // Sphere with zero velocity
    MovingSphere(double X, double Y, double Z, int R,
            int DX, int DY, int DZ);              // moving sphere constructor

    void MovingSphere::updateCenter(double multiplier);      // declaration


private:
    // delta X, etc. define rate of change ie. (+/-) units/second
    int dx, dy, dz;                         // sphere vector

};

#endif  /* MOVINGSPHERE_H */

MovingSphere.cpp

#include "MovingSphere.h"

MovingSphere::MovingSphere() : Sphere(), dx(0), dy(0), dz(0) {
} // default constructor (point at 0,0,0, with zero velocity)

MovingSphere::MovingSphere(double X, double Y, double Z, int R) :
        Sphere(X, Y, Z, R), dx(0), dy(0), dz(0){
} // sphere with zero velocity

MovingSphere::MovingSphere(double X, double Y, double Z, int R, int DX, int DY, int DZ) :
        Sphere(X, Y, Z, R), dx(DX), dy(DY), dz(DZ){
} // moving sphere constructor

// update location of sphere (mutator)
void MovingSphere::updateCenter(double multiplier) {
    adjustCenter(dx * multiplier, dy * multiplier, dz * multiplier);
}

Sphere.h

#ifndef SPHERE_H
#define SPHERE_H

#include "Point.h"

class Sphere {

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

    void setRadius(int newRadius); // declaration
    void adjustCenter(double DX, double DY, double DZ); // declaration

    int getRadius() const;         // declaration
    double getCenterX() const;        // declaration
    etc...

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

};

#endif  /* SPHERE_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(double X, double Y, double Z, int R) : center(X,Y,Z), radius(R) {
} // end sphere constructor

// set the sphere's radius (mutator)
void Sphere::setRadius(int newRadius) {
    radius = newRadius;
}

// set the sphere's center (mutator)
void Sphere::adjustCenter(double DX, double DY, double DZ) {
    center.setX(center.getX() + DX);
    center.setY(center.getX() + DY);
    center.setZ(center.getZ() + DZ);
}

// get the sphere's center X coordinate (constant function)
double Sphere::getCenterX() const {
    center.getX();
}
etc...


// get the sphere's radius (constant function)
int Sphere::getRadius() const {
    return radius;
}

Point.h

#ifndef POINT_H
#define POINT_H

class Point {

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

    void setX(double newX);                     // declaration

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


private:

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

};

#endif  /* POINT_H */

Point.cpp

#include "Point.h"

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

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

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

// set the points X coordinate (mutator)
void Point::setX(double newX) {
    x = newX;


// get the points X coordinate (constant function)
double Point::getX() const {
    return x;
}    
etc...

出力

X = nan
Y = nan
Z = nan
R = 3
DX = -10
DY = 5
DZ = 0
etc...
4

1 に答える 1

1

getCenterにリターンを追加します。

double Sphere::getCenterX() const {
    return center.getX();
}
于 2013-02-07T03:06:19.850 に答える