Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
azorge
1 / 1 / 0
Регистрация: 12.10.2015
Сообщений: 23
1

Реализация базового класса для геометрических фигур - C++

15.11.2015, 15:46. Просмотров 2168. Ответов 13
Метки нет (Все метки)

нужно реализовать базовый класс для геометрических фигур — Shape и два его наследника — Circle и Rectangle. У базового класса Shape нужно определить общий метод contains(double x, double y), который проверяет, лежит ли точка (x, y) внутри фигуры. В наследниках Shape нужно реализовать этот метод. В комментариях к коду указано, какие параметры должны принимать конструкторы классов-наследников, все аргументы имеют тип double.

Требования к реализации: При реализации не нужно вводить или выводить что-либо. Реализовывать main не нужно.

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
#include <cmath>
// Если потребуется, воспользуйтесь функцией sqrt для вычисления корня
 
// базовый класс для фигур
struct Shape
{
     // метод contains
};
 
// класс для круга
struct Circle
{
    // конструктор от координат центра и радиуса
    Circle(double x, double y, double r)
 
    // метод contains
};
 
// класс прямоугольника
struct Rectangle
{
    // конструктор от координат левого нижнего угла и правого верхнего угла
    // гарантируется, что x1 <= x2, y1 <= y2
    Rectangle(double x1, double y1, double x2, double y2)
 
    // метод contains
};
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2015, 15:46
Ответы с готовыми решениями:

Реализация базового класса для геометрических фигур
Нужно реализовать базовый класс для геометрических фигур — Shape и два его наследника — Circle и...

Написать программу для рисования геометрических фигур
Написать программу для рисования геометрических фигур

Построить систему классов для описания плоских геометрических фигур
Построить систему классов для описания плоских геометрических фигур: круга, квадрата,...

Построить систему классов для описания плоских геометрических фигур
C++ Построить систему классов для описания плоских геометрических фигур: круга, квадрата,...

Построить систему классов для описания плоских геометрических фигур
Здравствуйте. Прошу помощи) Вот сама задача Построить систему классов для описания плоских...

13
Operok
181 / 179 / 66
Регистрация: 15.02.2015
Сообщений: 515
Завершенные тесты: 2
15.11.2015, 16:36 2
Наверное как-то так:
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
#include <cmath>
 
struct Shape
{
    double X, Y;
    Shape() : X(), Y()
    {
    }
    Shape(double x, double y) : X(x), Y(y)
    {
    }
    virtual bool contains(double x, double y) const = 0;
};
 
struct Circle : Shape
{
    double R;
    Circle() : R()
    {
    }
    Circle(double r) : R(r)
    {
    }
    Circle(double x, double y, double r) : Shape(x, y), R(r)
    {
    }
    virtual bool contains(double x, double y) const override
    {
        double dx = abs(X - x);
        double dy = abs(Y - y);
        return R >= sqrt(dx*dx + dy*dy);
    }
};
 
struct Rectangle : Shape
{
    double X2, Y2;
    Rectangle() : X2(), Y2()
    {
    }
    Rectangle(double x1, double y1, double x2, double y2) :
        Shape(x1, y1), X2(x2), Y2(y2)
    {
    }
    virtual bool contains(double x, double y) const override
    {
        return x >= X && x <= X2
            && y >= Y && y <= Y2;
    }
};
0
azorge
1 / 1 / 0
Регистрация: 12.10.2015
Сообщений: 23
15.11.2015, 16:50  [ТС] 3
спасибо, почти так же решил, но нужен еще деструктор для shape
0
Operok
181 / 179 / 66
Регистрация: 15.02.2015
Сообщений: 515
Завершенные тесты: 2
15.11.2015, 16:55 4
Цитата Сообщение от azorge Посмотреть сообщение
но нужен еще деструктор для shape
зачем? что собираетесь в нём делать?
0
15.11.2015, 16:55
azorge
1 / 1 / 0
Регистрация: 12.10.2015
Сообщений: 23
15.11.2015, 16:58  [ТС] 5
удалять объекты Shape,разве нет?
0
Operok
181 / 179 / 66
Регистрация: 15.02.2015
Сообщений: 515
Завершенные тесты: 2
15.11.2015, 17:08 6
нет, не так, объект Shape будет удаляться либо непосредственным вызовом delete (в том числе "умным указателем"), либо, если он был создан на стеке, будет уничтожен при выходе из зоны видимости (или при исключении). В обоих случаях будет вызван деструктор (если не создавать самому, то создастся дефолтный), в котором нужно освободить ресурсы, которые объект использовал, в вашем случае таких ресурсов нет.
Если вы планируете дальше наследовать классы, которые будут использовать ресурсы, и имеет место быть полиморфизму, то базовому классу необходим виртуальный деструктор, но это опять не тот случай.
0
azorge
1 / 1 / 0
Регистрация: 12.10.2015
Сообщений: 23
15.11.2015, 17:26  [ТС] 7
спасибо
0
Lenchik854
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 13
15.11.2015, 20:53 8
Я тоже решаю эту задачу. Почему-то при таком решении как у Вас, выдаётся утечка памяти. Понять не могу где она тут может утекать?
0
Operok
181 / 179 / 66
Регистрация: 15.02.2015
Сообщений: 515
Завершенные тесты: 2
15.11.2015, 20:59 9
Lenchik854, тут (в описании классов) её быть не может, покажите, как вы их используете.
0
Lenchik854
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 13
15.11.2015, 21:28 10
Я не использую их ))). Это задание со Stepic, отправляю им класс, а валидатор пишет: memory leaks. Вот я и не понимаю, где это может быть. Стала искать в интернете что-то подобное, наткнулась на Ваше решение. По факту, такое же. Даже попробовала прямо его отправить, всё равно утечка. Вот я и не пойму, где она может быть?
0
hoggy
Эксперт С++
7402 / 3329 / 688
Регистрация: 15.11.2014
Сообщений: 7,614
Завершенные тесты: 1
15.11.2015, 21:32 11
Цитата Сообщение от Lenchik854 Посмотреть сообщение
Почему-то при таком решении как у Вас, выдаётся утечка памяти. Понять не могу где она тут может утекать?
отсутствует виртуальный диструктор.


Цитата Сообщение от Operok Посмотреть сообщение
Если вы планируете дальше наследовать классы, которые будут использовать ресурсы, и имеет место быть полиморфизму, то базовому классу необходим виртуальный деструктор, но это опять не тот случай.
Цитата Сообщение от Operok Посмотреть сообщение
virtual bool contains(double x, double y) const = 0;
у вас уже имеет место быть полиморфизму.
наследование публичное,
а значит допускает работу через полиморфный интерфейс.
а значит уже необходим вирт. диструктор.

http://rextester.com/YUSBR45596


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
73
#include <iostream>
 
#include <cmath>
 
struct Shape
{
    double X, Y;
    Shape() : X(), Y()
    {
    }
    Shape(double x, double y) : X(x), Y(y)
    {
    }
    virtual bool contains(double x, double y) const = 0;
};
 
struct Circle : Shape
{
    double R;
    Circle() : R()
    {
    }
    Circle(double r) : R(r)
    {
    }
    Circle(double x, double y, double r) : Shape(x, y), R(r)
    {
    }
    virtual bool contains(double x, double y) const override
    {
        double dx = abs(X - x);
        double dy = abs(Y - y);
        return R >= sqrt(dx*dx + dy*dy);
    }
};
 
struct Rectangle : Shape
{
    double X2, Y2;
    Rectangle() : X2(), Y2()
    {
    }
    Rectangle(double x1, double y1, double x2, double y2) :
        Shape(x1, y1), X2(x2), Y2(y2)
    {
    }
    virtual bool contains(double x, double y) const override
    {
        return x >= X && x <= X2
            && y >= Y && y <= Y2;
    }
};
 
 
struct trololo : Rectangle, Circle  //<--- UB
{};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    Shape* base = new Rectangle;
    
    delete base; //<--- утечка
    
    Circle* base1 = new trololo;
    
    delete base1; //<--- uppsss....
    
    std::cout<<"finished!\n";
}
Warning(s):
source_file.cpp: In function ‘int main()’:
source_file.cpp:69:12: warning: deleting object of abstract class type ‘Shape’ which has non-virtual destructor will cause undefined behaviour [-Wdelete-non-virtual-dtor]
delete base; //<--- утечка
^
source_file.cpp:73:12: warning: deleting object of polymorphic class type ‘Circle’ which has non-virtual destructor might cause undefined behaviour [-Wdelete-non-virtual-dtor]
delete base1; //<--- uppsss....
^
Error(s):
*** Error in `/var/www/service/usercode/280413897/a.out': free(): invalid pointer: 0x0000000001efd068 ***

Abort signal from abort(3) (SIGABRT)
Hello, world!
1
Lenchik854
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 13
15.11.2015, 21:42 12
hoggy, спасибо большое за объяснение ))))
0
Operok
181 / 179 / 66
Регистрация: 15.02.2015
Сообщений: 515
Завершенные тесты: 2
16.11.2015, 06:58 13
hoggy, виртуальный деструктор у базового класса при полиморфизме нужен, но не всегда необходим (если ни один наследник не реализует свой деструктор и наследники не инкапсулируют объекты других классов с деструктором). Поэтому, в рамках задания при использовании этих классов не будет утечки. В new выделится блок памяти размером sizeof(Rectangle), при вызове delete этот же блок памяти и освободится (в него входят данные классов Shape и Rectangle, плюс указатель на таблицу виртуальных методов).
0
hoggy
Эксперт С++
7402 / 3329 / 688
Регистрация: 15.11.2014
Сообщений: 7,614
Завершенные тесты: 1
16.11.2015, 21:07 14
Цитата Сообщение от Operok Посмотреть сообщение
при вызове delete
стандарт гласит - UB.

вы знаете, что такое UB ?
это значит, поведение не определено.
может произойти все что угодно.

кстати, об этом прямым английским текстом предупреждает компилятор:
Цитата Сообщение от hoggy Посмотреть сообщение
deleting object of abstract class type ‘Shape’ which has non-virtual destructor will cause undefined behaviour
утечки - далеко не самое фатальное.
выше я специально для вас привел выдержку кода,
который иллюстрирует,
как при множественном наследовании,
процесс получает от системы живительную эвтаназию,
за попытку освободить часть памяти объекта.

из чего вы должны были сделать вывод:
виртуальный диструктор нужен всегда,
если предполагается освобождать память наследников,
при работе с интерфейсами.
0
16.11.2015, 21:07
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2015, 21:07

Разработать библиотеку математических функций для вычисления площадей плоских геометрических фигур
Разработать библиотеку математических функций для вычисления площадей плоских геометрических фигур...

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на...

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.