Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 12.10.2015
Сообщений: 23

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

15.11.2015, 15:46. Показов 5377. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.11.2015, 15:46
Ответы с готовыми решениями:

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

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

Многофайловая система классов для описания плоских геометрических фигур
Помогите пожалуйста составить по данной программе многофайловую систему,а то у меня не получается реализовать корректную работу отдельных...

13
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
15.11.2015, 16:36
Наверное как-то так:
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
1 / 1 / 0
Регистрация: 12.10.2015
Сообщений: 23
15.11.2015, 16:50  [ТС]
спасибо, почти так же решил, но нужен еще деструктор для shape
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
15.11.2015, 16:55
Цитата Сообщение от azorge Посмотреть сообщение
но нужен еще деструктор для shape
зачем? что собираетесь в нём делать?
0
1 / 1 / 0
Регистрация: 12.10.2015
Сообщений: 23
15.11.2015, 16:58  [ТС]
удалять объекты Shape,разве нет?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
15.11.2015, 17:08
нет, не так, объект Shape будет удаляться либо непосредственным вызовом delete (в том числе "умным указателем"), либо, если он был создан на стеке, будет уничтожен при выходе из зоны видимости (или при исключении). В обоих случаях будет вызван деструктор (если не создавать самому, то создастся дефолтный), в котором нужно освободить ресурсы, которые объект использовал, в вашем случае таких ресурсов нет.
Если вы планируете дальше наследовать классы, которые будут использовать ресурсы, и имеет место быть полиморфизму, то базовому классу необходим виртуальный деструктор, но это опять не тот случай.
0
1 / 1 / 0
Регистрация: 12.10.2015
Сообщений: 23
15.11.2015, 17:26  [ТС]
спасибо
0
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 13
15.11.2015, 20:53
Я тоже решаю эту задачу. Почему-то при таком решении как у Вас, выдаётся утечка памяти. Понять не могу где она тут может утекать?
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
15.11.2015, 20:59
Lenchik854, тут (в описании классов) её быть не может, покажите, как вы их используете.
0
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 13
15.11.2015, 21:28
Я не использую их ))). Это задание со Stepic, отправляю им класс, а валидатор пишет: memory leaks. Вот я и не понимаю, где это может быть. Стала искать в интернете что-то подобное, наткнулась на Ваше решение. По факту, такое же. Даже попробовала прямо его отправить, всё равно утечка. Вот я и не пойму, где она может быть?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.11.2015, 21:32
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 10.12.2013
Сообщений: 13
15.11.2015, 21:42
hoggy, спасибо большое за объяснение ))))
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
16.11.2015, 06:58
hoggy, виртуальный деструктор у базового класса при полиморфизме нужен, но не всегда необходим (если ни один наследник не реализует свой деструктор и наследники не инкапсулируют объекты других классов с деструктором). Поэтому, в рамках задания при использовании этих классов не будет утечки. В new выделится блок памяти размером sizeof(Rectangle), при вызове delete этот же блок памяти и освободится (в него входят данные классов Shape и Rectangle, плюс указатель на таблицу виртуальных методов).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.11.2015, 21:07
Цитата Сообщение от Operok Посмотреть сообщение
при вызове delete
стандарт гласит - UB.

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

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

из чего вы должны были сделать вывод:
виртуальный диструктор нужен всегда,
если предполагается освобождать память наследников,
при работе с интерфейсами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.11.2015, 21:07
Помогаю со студенческими работами здесь

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

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

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

Класс для подсчета площади геометрических фигур ошибка при компиляции
Здравствуйте. При компиляции выводит ошибку: &quot;CL.exe&quot; завершилась с кодом 2. Конкретно номер строки в коде не показывает, где ошибка. ...

Реализация физических законов для разных геометрических фигур
Уже давно пытаюсь разобраться с тем, как работает физический движок, на котором, например, основан numpty physic. Каким образом вычисляются...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru