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

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

08.11.2015, 14:59. Показов 10758. Ответов 14
Метки нет (Все метки)

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

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


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <cmath>
// Воспользуйтесь константой для пи - M_PI
 
// базовый класс для фигур
struct Shape
{
     // метод area вычисляющий площадь фигуры
};
 
// класс для круга
struct Circle
{
    // конструктор от радиуса
    // реализация метода area
};
 
// класс прямоугольника
struct Rectangle
{
    // конструктор от ширины и высоты
    // реализация метода area
};
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2015, 14:59
Ответы с готовыми решениями:

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

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

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

14
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:12
Ingvar2,

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
// базовый класс для фигур
class Shape {
public:
    virtual ~Shape() {}
     // метод area вычисляющий площадь фигуры
    virtual double area() const = 0;
};
 
// класс для круга
class Circle : public Shape {
public:
    // конструктор от радиуса
    Circle(size_t r) : m_r(r) { }
 
    // реализация метода area
    double area() const {
        return M_PI * m_r * m_r;
    }
 
private:
    size_t m_r;
};
 
// класс прямоугольника
class Rectangle : public Shape {
public:
    // конструктор от ширины и высоты
    Rectangle(size_t w, size_t h) : m_w(w), m_h(h) { }
 
    // реализация метода area
    double area() const {
        return m_w * m_h;
    }
 
private:
    size_t m_w;
    size_t m_h;
};
0
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:12
Может вместе найдем ошибку у меня. Задача таже
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
#include <cmath>
// Воспользуйтесь константой для пи - M_PI
#define M_PI 3.14159265358979323846
 
// базовый класс для фигур
struct Shape
{
     // метод area вычисляющий площадь фигуры    
    virtual double area() const = 0;
};
 
// класс для круга
struct Circle : Shape
{
    // конструктор от радиуса
    Circle(double r) : r(r)
    {}
    // реализация метода area
    double area(double r) {
        return r*r*M_PI;
    }
    
    double r;
};
 
// класс прямоугольника
struct Rectangle : Shape
{
    // конструктор от ширины и высоты
    Rectangle(double width, double height) : width(width), height(height)
    {}
    // реализация метода area
    double area(double width, double height) {
        return width*height;
    }
    
    double height;
    double width;
};
Что-то тут не так, так как не хочет компилировться

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
Compilation error
main.cpp: In function ‘int main():
main.cpp:109:30: error: invalid new-expression of abstract class type ‘Circle’
     Shape * s1 = new Circle(r);
                              ^
main.cpp:58:8: note:   because the following virtual functions are pure within ‘Circle’:
 struct Circle : Shape
        ^
main.cpp:54:20: note:   virtual double Shape::area() const
     virtual double area() const = 0;
                    ^
main.cpp:114:36: error: invalid new-expression of abstract class type ‘Rectangle’
     Shape * s2 = new Rectangle(w, h);
                                    ^
main.cpp:72:8: note:   because the following virtual functions are pure within ‘Rectangle’:
 struct Rectangle : Shape
        ^
main.cpp:54:20: note:   virtual double Shape::area() const
     virtual double area() const = 0;
                    ^
main.cpp:119:31: error: invalid new-expression of abstract class type ‘Rect’
     Shape * s3 = new Rect(h, w);
                               ^
main.cpp:90:8: note:   because the following virtual functions are pure within ‘Rect’:
 struct Rect : Rectangle {
        ^
main.cpp:54:20: note:   virtual double Shape::area() const
     virtual double area() const = 0;
0
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:19
Ginvra, const забыл добавить в реализациях функции area.
и параметры в area зачем то добавил. сигнатура в реализации функций должна быть такая же, как и в базовом классе. иначе ты создаешь новую функцию, а не переопределяешь.
1
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:27
такс, а по поводу параметров плиз поподробнее, у Вас в коде тоже сигнатуры функций отличаются от базовых, или Вы о другом? Т.е. мне нужно написать вместо

C++
1
2
3
double area(double r) {
        return r*r*M_PI;
    }
вот это (или тут без this? хотя как тогда понять откуда берется значение7)

C++
1
2
3
double area() {
        return this->r*this->r*M_PI;
    }
0
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:32
Ginvra, где у меня отличается?

Добавлено через 23 секунды
Ginvra, вот это. this не обязателен
0
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:34
да, извините, невнимательным был, у Вас не отличаются. Сейчас проверим этот вариант.

Получилось следующее:

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
#include <cmath>
// Воспользуйтесь константой для пи - M_PI
 
// базовый класс для фигур
struct Shape
{
     // метод area вычисляющий площадь фигуры    
    virtual double area() const = 0;
};
 
// класс для круга
struct Circle : Shape
{
    // конструктор от радиуса
    Circle(double r) : r(r)
    {}
    // реализация метода area
    double area() const {
        return r*r*M_PI;
    }
    
private:
    double r;
};
 
// класс прямоугольника
struct Rectangle : Shape
{
    // конструктор от ширины и высоты
    Rectangle(double width, double height) : width(width), height(height)
    {}
    // реализация метода area
    double area() const {
        return width*height;
    }
    
private:
    double height;
    double width;
};
и ошибка

C++
1
2
3
Failed test #1. Run time error:
terminate called after throwing an instance of 'std::logic_error'
  what():  Memory leaks
0
 Аватар для Barrent
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
08.11.2015, 15:39
Для таких случаев придумали ключевое слово override
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Shape
{
public:
    virtual double area() const = 0;
};
 
class Circle : public Shape
{
public:
    double area() const override{}  //ОК
};
 
class Rectangle : public Shape
{
public:
    double area(int a) const override{}//Будет сообщение о том, что метод никаких таки базовых не переоперделяет
};
1
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:44
Ginvra, виртуальный деструктор забыл в базовый класс добавить. у меня посмотри как.
1
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:47
pproger, Спасибо большое, у меня почему-то в голове мысль закрепилась, что компилятор сам поставит деструктор, если его нет(не понимаю откуда такая мысль висит, но даже и не подумал о нем, когда увидел, что память течет)
0
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:48
Ginvra, поставит. но не виртуальный.
0
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:49
pproger, хм...значит мысль не просто так висит и я не перепутал с чем-то другим. Пойду перечитаю материал более подробно. Еще раз спасибо.
0
2 / 2 / 1
Регистрация: 22.07.2015
Сообщений: 36
08.11.2015, 15:53  [ТС]
Ginvra, а как в итоге правильно?
0
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:58
Лучший ответ Сообщение было отмечено Ingvar2 как решение

Решение

Ingvar2, в мой последний вариант добавить виртуальный деструктор и получить следующее:

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
#include <cmath>
// Воспользуйтесь константой для пи - M_PI
 
// базовый класс для фигур
struct Shape
{
    virtual ~Shape() {}
     // метод area вычисляющий площадь фигуры    
    virtual double area() const = 0;
};
 
// класс для круга
struct Circle : Shape
{
    // конструктор от радиуса
    Circle(double r) : r(r)
    {}
    // реализация метода area
    double area() const {
        return r*r*M_PI;
    }
    
private:
    double r;
};
 
// класс прямоугольника
struct Rectangle : Shape
{
    // конструктор от ширины и высоты
    Rectangle(double width, double height) : width(width), height(height)
    {}
    // реализация метода area
    double area() const {
        return width*height;
    }
    
private:
    double height;
    double width;
};
0
2 / 2 / 1
Регистрация: 22.07.2015
Сообщений: 36
08.11.2015, 16:34  [ТС]
Спасибо.

Добавлено через 33 минуты
Ginvra, можешь мне в личку кинуть свой варианта шага 1? Мой система не принимает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2015, 16:34
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru