Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ingvar2
2 / 2 / 1
Регистрация: 22.07.2015
Сообщений: 36
#1

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

08.11.2015, 14:59. Просмотров 1338. Ответов 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++):

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

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

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

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

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

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

14
pproger
164 / 67 / 13
Регистрация: 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
164 / 67 / 13
Регистрация: 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
164 / 67 / 13
Регистрация: 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 / 41
Регистрация: 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
164 / 67 / 13
Регистрация: 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
164 / 67 / 13
Регистрация: 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, в мой последний вариант добавить виртуальный деструктор и получить следующее:

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
Привет! Вот еще темы с ответами:

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

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса - C++
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

Написать программу, в которой объединение используется для хранения информации об одной из геометрических фигур - C++
НАРОООООД!!!!Выручьте!!!! &quot;сделать на Borland C++ под DOS или Microsoft Visual C++ консольное приложение (Win 32 Console Application). ...

Разработка программы для вычисления объема геометрических фигур; вычисление результата 'непростой' формулы - C++
Доброго вам времени суток, господа. Прошу помощи в написании пары легких программок на языке СИ. Задания таковы: Составить...


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

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

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