Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Ingvar2
2 / 2 / 1
Регистрация: 22.07.2015
Сообщений: 36
1

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

08.11.2015, 14:59. Просмотров 1631. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2015, 14:59
Ответы с готовыми решениями:

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

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

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

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

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

14
pproger
165 / 68 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:12 2
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
Ginvra
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:12 3
Может вместе найдем ошибку у меня. Задача таже
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
pproger
165 / 68 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:19 4
Ginvra, const забыл добавить в реализациях функции area.
и параметры в area зачем то добавил. сигнатура в реализации функций должна быть такая же, как и в базовом классе. иначе ты создаешь новую функцию, а не переопределяешь.
1
Ginvra
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:27 5
такс, а по поводу параметров плиз поподробнее, у Вас в коде тоже сигнатуры функций отличаются от базовых, или Вы о другом? Т.е. мне нужно написать вместо

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
pproger
165 / 68 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:32 6
Ginvra, где у меня отличается?

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

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

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
246 / 122 / 54
Регистрация: 04.05.2013
Сообщений: 346
Завершенные тесты: 2
08.11.2015, 15:39 8
Для таких случаев придумали ключевое слово 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
pproger
165 / 68 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:44 9
Ginvra, виртуальный деструктор забыл в базовый класс добавить. у меня посмотри как.
1
Ginvra
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:47 10
pproger, Спасибо большое, у меня почему-то в голове мысль закрепилась, что компилятор сам поставит деструктор, если его нет(не понимаю откуда такая мысль висит, но даже и не подумал о нем, когда увидел, что память течет)
0
pproger
165 / 68 / 17
Регистрация: 22.03.2011
Сообщений: 196
08.11.2015, 15:48 11
Ginvra, поставит. но не виртуальный.
0
Ginvra
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:49 12
pproger, хм...значит мысль не просто так висит и я не перепутал с чем-то другим. Пойду перечитаю материал более подробно. Еще раз спасибо.
0
Ingvar2
2 / 2 / 1
Регистрация: 22.07.2015
Сообщений: 36
08.11.2015, 15:53  [ТС] 13
Ginvra, а как в итоге правильно?
0
Ginvra
0 / 0 / 1
Регистрация: 25.10.2015
Сообщений: 8
08.11.2015, 15:58 14
Лучший ответ Сообщение было отмечено 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
Ingvar2
2 / 2 / 1
Регистрация: 22.07.2015
Сообщений: 36
08.11.2015, 16:34  [ТС] 15
Спасибо.

Добавлено через 33 минуты
Ginvra, можешь мне в личку кинуть свой варианта шага 1? Мой система не принимает
0
08.11.2015, 16:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2015, 16:34

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

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

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


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

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

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