Почему мои значения не инициализируются конструкторами инициализации (параметризации)? - PullRequest
1 голос
/ 11 июня 2019

У меня есть базовый класс Point с 3 переменными, которые я хочу получить как Body атрибуты.Я хочу инициализировать точку и использовать ее для инициализации объекта тела.Вот что у меня есть:

#include <iostream>
using namespace std;

class Point {
    public:
        double x, y, z;

        // default constructor
        Point(): x(0), y(0), z(0){
        };
        // intialization constructor
        Point(double x, double y, double z){
            x = x;
            y = y;
            z = z;
        }
        // copy constructor
        Point(const Point &point){
            x = point.x;
            y = point.y;
            z = point.z;
        }

        void print_point(){
            cout << "x = "<< x << " y = " << y << " z = " << z << endl;
        }
};

class Body: public Point{
    public:
        double mass;

        // default constructor
        Body(): Point(0, 0, 0), mass(0){
        };
        // intialization constructor
        Body(const Point& point, double mass): Point(point.x, point.y, point.z){
            mass = mass;
        }
        // copy constructor
        Body(const Body &body): Point(body){
            mass = body.mass;
        }

        void print_body(){
            cout << "x = "<< x << " y = " << y << " z = " << z << " mass = " << mass << endl;
        }
};


int main() {

    Point p(1., 2., 3.);
    p.print_point();

    Body b(p, 65.);
    b.print_body();

    return 0;
}

Когда я компилирую и запускаю это, я получаю:

x = 0 y = 0 z = 6.95312e-310
x = 2.25081e-314 y = 0 z = 0 mass = 0

Когда я ожидаю получить:

x = 1 y = 2 z = 3
x = 1 y = 2 z = 3 mass = 65

Это похоже на то, что переменные сбрасываются конструкторами по умолчанию, и я не знаю, что вызвало это.

1 Ответ

7 голосов
/ 11 июня 2019

Вы должны изменить присвоение внутри тела конструктора с

x = x;
y = y;
z = z;

на

this->x = x;
this->y = y;
this->z = z;

Внутри тела конструктора имя параметра скрывает члена данныхназвание.Например, x = x; просто присваивает параметр x самому себе, не назначает элемент данных x.Класс Body имеет ту же проблему.

Лучше было бы инициализировать элементы данных с помощью списка инициализаторов элементов , (кстати, у него нет сокрытия имени выпуск).например,

Point(double x, double y, double z) : x(x), y(y), z(z) {}
...