Базовый класс Фигура

270
13 октября 2017, 16:08

Базовый класс Фигура с полем «название фигуры» и методом «Печать названия». Производный класс Шар с полем Радиус. Переопределить для него функцию Печать так,чтобы она выводила данные о шаре на экран. Описать в классе дополнительную функцию Объем, вычисляющую объем фигуры и печатающую результат на экран.

    #include <iostream>
#include <string>
#include <math.h>
using namespace std;
class Figura
{
protected:      
    string name;
public:
    Figura(string name){ this->name = name; }
    void show_name() { cout << name << endl; }
};
class Shar : public Figura {
    protected: 
        float radius;
    public:
        Shar(string name, float radius):Figura(name) {this->radius = radius; }
        void show_name() {cout <<"Фигура: " << name << endl; }
        void vRadius() {
            v = (4*M_PI*radius*radius*radius)/3;
            cout << "Объем шара: " <<v<<endl;
        }
    private:
        float v;
};
int main() {
    Figura f("Фигура");
    f.show_name();
    cout<<"----------------------------------"<<endl;
    Shar shar("Шар",7);
    shar.show_name();
    shar.vRadius();
}
Answer 1

для инициализации вместо присваивания в теле конструктора

this->name = name;

лучше использовать более эффективную во всех отношениях инициализацию полей в списке инициализации конструктора

Figura(string name)
 : name(name){
}

тоже относится и к классу Shar, в котором вы, кстати, использовали этот способ, но не полностью

Shar(string name, float radius):Figura(name){
 this->radius = radius;
}

этот конструктор лучше записать так

Shar(string name, float radius)
 : Figura(name), radius(radius){
}

приватное поле v используется только как локальная переменная в методе vRadius, поэтому ее, стоило бы сделать локальной переменной в этом методе. Но, если вы планируете впоследствии использовать рассчитанное значение, то приватное поле для нее - это нормально. Но тошда стоит придерживаться принципа - одна функция - одно действие(логическое) Т.е. vRadius не должна вычислять значение объема и выводить его. Стоит разделить ее на две функции. Одну - для вычисления объема, вторую для отображения объема

void calcVolume() {
 v = (4*M_PI*radius*radius*radius)/3;
}
void show_volume() {
 cout << "Объем шара: " <<v<<endl;
}

ну, а так как объем шара однозначно зависит от радиуса, то можно перенести вычисление объема в конструктор и инициализировать его сразу при создании объекта

Shar(string name, float radius)
 : Figura(name), radius(radius), v(4*M_PI*radius*radius*radius/3){
}

В итоге получиться так

#include <iostream>
#include <string>
#include <math.h>
using namespace std;
class Figura{
protected:      
    string name;
public:
    Figura(string name)
    :   name(name){}
    void show_name() {
        cout << name << endl;
    }
};
class Shar : public Figura {
    protected: 
        float radius;
    public:
        Shar(string name, float radius)
            :   Figura(name), radius(radius), v(4*M_PI*radius*radius*radius/3){
        }
        void show_name(){
            cout <<"Фигура: " << name << endl;
        }
        void show_volume() {
            cout << "Объем шара: " <<v<<endl;
        }
    private:
        float v;
};
int main() {
    Figura f("Фигура");
    f.show_name();
    cout<<"----------------------------------"<<endl;
    Shar shar("Шар",7);
    shar.show_name();
    shar.show_volume();
}
READ ALSO
Олимпиадная задача проходит на 80%

Олимпиадная задача проходит на 80%

Определить координаты малейшего интервала с целочисленными координатами концов, на который приходятся значения элементов действительной...

201
Запись чисел из файла в массив типа int

Запись чисел из файла в массив типа int

Встал перед вопросом, как считать числа из текстового файла напрямую в массив

592
Виртуальное наследование

Виртуальное наследование

Почему данный код не работает?

316
Передача файла в параметр функции,с++

Передача файла в параметр функции,с++

Как передать файл в функцию вроде разобралсяНо есть непонятные моменты

228