Форум программистов, компьютерный форум CyberForum.ru

Корректно ли я написал наследование? - C++

Восстановить пароль Регистрация
 
poliglot
0 / 0 / 0
Регистрация: 04.01.2013
Сообщений: 13
26.03.2014, 01:01     Корректно ли я написал наследование? #1
Недавно начал изучать с++. Задача такая :
Создать абстрактный класс Figure.
На его основе реализовать классы Rectangle (прямоугольник), Circle (круг)
с возможностью вычисления площади, центра тяжести и периметра.
Самостоятельно определить, какие поля необходимы,
какие из них можно задать в базовом классе, какие – в производных

Корректно ли решение или я чего-то не так(не совсем так) делаю? И правильно ли я создал абстрактный класс?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <conio.h>
 
using namespace std;
class Figure{
public:
    int x,y;//Координаты
    Figure(int x=0, int y=0){
    this->x=x;
    this->y=y;
    }
    virtual double  Area()=0;
    virtual void    Center()=0;
    virtual double  Perimetr()=0;
};
 
class Circle:public Figure{
    const double pi;
    double R;
public:
    Circle():Figure(),pi(3.14159){
    cout<<"Введите координаты центра окружности: ";
    cin>>x>>y;
    cout<<"Введите радиус: ";
    cin>>R;
    }
 
   double Area(){
    return pi*R*R;
   }
 
   double Perimetr(){
    return 2*pi*R;
   }
   void Center(){
    cout<<"Центр тяжести: ("<<x<<","<<y<<")";
   }
 
 
};
 
class Rectangle:public Figure{
public:
    int x1,y1;
    Rectangle(int z):Figure(){
    cout<<"Введите координаты левого нижнего угла:";
    cin>>x>>y;
    cout<<"Введите координаты правого верхнего угла:";
    cin>>x1>>y1;
    }
    double Area(){
    return (x1-x)*(y1-y);
    }
 
    double Periment(){
    return 2*( (x1-x)+(y1-y) );
    }
 
    void Center(){
    cout<<"Центр тяжести: ("<<(x1-x)/2<<","<<(y1-y)/2<<")";
    }
};
 
 
void main(){
   setlocale(LC_ALL,"Russian");
   Circle a;
   cout<<a.Area()<<endl;
   cout<<a.Perimetr()<<endl;
   a.Center();
    _getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 01:01     Корректно ли я написал наследование?
Посмотрите здесь:

C++ Написал но не уверен что правильно
Правильно ли я написал? C++
Правильно ли я написал программу? Оператор if C++
написал программу, ошибка! C++
C++ написал вирус случайно :D
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.03.2014, 02:31     Корректно ли я написал наследование? #2
Я бы заменил, в базовом классе, координаты на переменные для хранения площади, центра тяжести и периметра, а из конструкторов производных убрал бы ввод координат.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
26.03.2014, 09:36     Корректно ли я написал наследование? #3
Константу Пи убери из класса, она там ни к чему.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
26.03.2014, 09:39     Корректно ли я написал наследование? #4
виртуальный деструктор
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
26.03.2014, 09:48     Корректно ли я написал наследование? #5
45-я строка - список инициализации не нужен.
В 8-й строке наоборот его не хватает.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
26.03.2014, 10:16     Корректно ли я написал наследование? #6
Может быть так будет лучше?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <cmath>
using namespace std;
class Figure{
protected:
    int x;
    int y;
public:
    Figure(): x(), y()
    {}
    Figure(int _x, int _y): x(_x), y(_y)
    {}
    virtual double  Area() = 0;
    virtual double  Perimetr() = 0;
    virtual void    Center() = 0;
    virtual ~Figure() {};
};
 
class Circle: public Figure{
    double R;
public:
    Circle():Figure(), R(0)
    {}
    Circle(int _x, int _y, double _R):Figure(_x, _y), R(_R)
    {}
    virtual double Area(){ return M_PI * R * R; }
    virtual double Perimetr(){ return 2 * M_PI * R; }
    virtual void Center(){ cout<<"Центр тяжести: (" << x << ", " << y << ")" << '\n'; }
    virtual ~Circle() {};
};
 
class Rectangle: public Figure{
    int x1;
    int y1;
public:
    Rectangle():Figure(), x1(), y1()
    {}
    Rectangle(int _x, int _y, int _x1, int _y1):Figure(_x, _y), x1(_x1), y1(_y1)
    {}
    virtual double Area(){ return (x1 - x) * (y1 - y); }
    virtual double Periment(){ return 2 * ((x1 - x) + (y1 - y)); }
    virtual void Center(){ cout<<"Центр тяжести: (" << (x1-x) / 2 << ", " << (y1-y) / 2 << ")" << '\n'; }
    virtual ~Rectangle() {};
};
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.03.2014, 11:11     Корректно ли я написал наследование? #7
Ilot, пустой деструктор в дочерних классах не нужен.
Имена переменных с подчеркивания - плохо. protected данные - плохо. Функции, не изменяющие объект следует сделать константными.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
26.03.2014, 11:18     Корректно ли я написал наследование? #8
Tulosba, все понимаю, но почему protected данные плохо?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.03.2014, 11:32     Корректно ли я написал наследование? #9
Ilot, в общем случае это может нарушить инвариант класса.
http://stackoverflow.com/questions/3...mber-variables
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2014, 12:41     Корректно ли я написал наследование?
Еще ссылки по теме:

C++ Написал калькулятор
Ребят я правильно написал код:)? C++
C++ написал код не работает

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
26.03.2014, 12:41     Корректно ли я написал наследование? #10
Цитата Сообщение от Tulosba Посмотреть сообщение
в общем случае это может нарушить инвариант класса.
Короче, позволю себе вольный квинтессированный перевод: если вы не боитесь, что кто-то потом запорет ваши классы, наследуюясь от них и получая тем самым возможность менять то, что раньше могли менять только вы, то используйте protected.
Yandex
Объявления
26.03.2014, 12:41     Корректно ли я написал наследование?
Ответ Создать тему
Опции темы

Текущее время: 23:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru