Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425

Абстрактные классы

20.02.2020, 13:11. Показов 5517. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста с программой.
Создать абстрактный класс Body. На его основе реализовать классы Parallelepiped (прямоугольный параллелепипед), Cone (конус) и Ball (шар) с возможностью вычисления площади поверхности и объема.
Создать класс Series(набор), содержащий массив объектов этих классов в динамической памяти. Предусмотреть вохможность вывода характеристик объектов списка.

Начал делать код, создал абстрактный класс, но не уверен что правильно, сделал класс вроде как для фигуры...
C++
1
2
3
4
5
6
7
#pragma once //Абстрактный класс Body
class Body
{
public:
    virtual double Ploshad() const = 0;
    virtual double Obiem() const = 0;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
#include "Body.h"
class Circle : public Body //класс круг
{
public:
    Circle(double r = 1) : _r(r) { }
 
    virtual double area() const { return 3.14159265358 * _r * _r; }
 
private:
    double _r;
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2020, 13:11
Ответы с готовыми решениями:

Абстрактные классы
В общем есть у нас 2 абстрактных класса CA и CB и 2 дочерних от них класса CC и CD. Как сделать так чтобы CD наследовал CB поверх которого...

Абстрактные классы
Никак не могу понять смысл абстрактных данных.Ведь мы можем использовать и обычный класс,только абстракция запрещает создавать объекты.

Абстрактные классы
void _tmain() { const int lim = 100; MyFunction *pFunc ; int count = 0; pFunc = new My_Exp; pFunc = new Line; pFunc...

36
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.02.2020, 16:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Проверил, да. 5, 12, 18, 20 строчки - ошибки вылезают.
Думаю, ты сам их легко исправишь
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
23.02.2020, 16:36  [ТС]
Исправил, спасибо большое. Получается cpp можно оставить пустой и оставить только хедер файл?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.02.2020, 16:38
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Исправил, спасибо большое. Получается cpp можно оставить пустой и оставить только хедер файл?
Как хочешь. Здесь это не принципиально.
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
23.02.2020, 16:47  [ТС]
Удалил Series.cpp, повестил в int main следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Body *m_bodies[3];
 
    m_bodies[0] = new Ball(2);
    m_bodies[1] = new Parallelepiped(1,2,3);
    m_bodies[2] = new Cone(1,2,3);
 
 
    for (int i = 0; i < 3; ++i)
        std::cout << m_bodies[i]->SurfaceArea() << std::endl;
 
    for (int i = 0; i < 3; ++i)
        delete m_bodies[i];
    return 0;
Выдаёт ошибку на этапе компиляции.

Добавлено через 1 минуту
Series.h
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
#pragma once
#include "Body.h"
#include <iostream>
class Series
{
public:
    Series(size_t cap)
        : m_bodies(new Body *[cap])
    {
    }
 
    ~Series()
    {
        for (int i = 0; i < m_sz; ++i)
            delete m_bodies[i];
 
        delete[] m_bodies;
    }
    void Add(Body* body)
    {
        m_bodies[m_sz++] = body;
    }
    size_t Size() const;
    Body* operator[](size_t idx);
protected:
    Body **m_bodies;
    size_t m_sz = 0;
};
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
23.02.2020, 16:49
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Выдаёт ошибку на этапе компиляции.
Что за ошибка?
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
size_t Size() const;
    Body* operator[](size_t idx);
Здесь тоже надо реализацию написать
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
23.02.2020, 16:58  [ТС]
Понял. Спасибо большое, Олег, часто отзываетесь. Думаю далее проблем не возникнет. Пойду разбираться с классом и реализацией))
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
24.02.2020, 14:46  [ТС]
Дописал я вчера код к классу Series, но он не хочет записывать данные моих фигур и выводить на экран.. Можете пожалуйста помочь дописать реализацию?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.02.2020, 14:48
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Дописал я вчера код к классу Series, но он не хочет записывать данные моих фигур и выводить на экран.. Можете пожалуйста помочь дописать реализацию?
Покажи сначала, что написал.
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
24.02.2020, 15:07  [ТС]
Секунду.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Series: public Body{
public:
 
    virtual ~Series() {};
    
    void destroy(Dinamic& arr, int k);
    char show();
};
 
void show(Dinamic& arr);
 
int min(int a, int b) {
    if (a > b) return b; else return a;
}
Series::~Series() {
    for (int i = 0; i < len; i++)
    delete v[i];
    delete v;
    
}
Попытался вообще другое сделать, потому что не совсем понял в вашем примере, как реализацию в операторе писать. Можете даже не читать этот бред :d
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.02.2020, 15:14
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Попытался вообще другое сделать, потому что не совсем понял в вашем примере, как реализацию в операторе писать. Можете даже не читать этот бред :d
C++
1
2
3
4
5
6
7
8
9
10
size_t Size() const
{
   return m_sz ;
 
 
 
    Body* operator[](size_t idx)
{
  return m_bodies[idx];
}
Потом работаешь с этой Series как с обычным массивом
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    Series series(100);
 
    series.Add(new Ball(3));
    series.Add(new Parallelepiped(2));
    series.Add(new Cone(2.5));
 
 
    for (int i = 0; i < series.GetSize(); ++i)
        std::cout << series[i]->SurfaceArea() << std::endl;
}
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
24.02.2020, 15:20  [ТС]
C++
1
 for (int i = 0; i < series.GetSize(); ++i)
Как понимаю заместо GetSize(); тут должно быть просто Size?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.02.2020, 15:29
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Как понимаю заместо GetSize(); тут должно быть просто Size?
Ну, наверное
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
24.02.2020, 16:13  [ТС]
Ошибка: <: несоответствие типов со знаком и без знака ConsoleApplication6
Я пробовал использовать не int, а size_t который возвращает .size(), но всё равно не помогло.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.02.2020, 17:10
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Ошибка: <: несоответствие типов со знаком и без знака ConsoleApplication6
Я пробовал использовать не int, а size_t который возвращает .size(), но всё равно не помогло.
Покажи код
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
24.02.2020, 17:52  [ТС]
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
74
75
76
77
78
79
//ConsoleApplication6
#include "pch.h"
#include <iostream>
#include "Parallelepiped.h"
#include "Body.h"
#include "Ball.h"
#include "Cone.h"
#include "Series.h"
#include <vector>
 
using namespace std;
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int e;
    do {
        system("pause");
        system("cls");
        cout << "[Protected By Airat]=> Введите номер выбора: " << endl;
        cout << "1. Найти объем и площадь прямоугольного параллелепипеда.  " << endl;
        cout << "2. Найти объем и площадь шара." << endl;
        cout << "3. Найти объем и площадь конуса." << endl;
        cout << "4. Выход из программы." << endl;
        cin >> e;
        switch (e)
        {
        case 1:
        {
            std::vector<Body *> bodies;
            bodies.emplace_back(new Parallelepiped(1, 2, 3));
 
            for (auto* body : bodies)
                body->Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
 
            for (auto* body : bodies)
                delete body;
        }; break;
        case 2:
        {
            std::vector<Body *> bodies;
            bodies.emplace_back(new Ball(2));       
 
            for (auto* body : bodies)
                body->Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
 
            for (auto* body : bodies)
                delete body;
        }; break;
        case 3: 
        {
            std::vector<Body *> bodies;
            bodies.emplace_back(new Cone(1, 2, 3));         
 
            for (auto* body : bodies)
                body->Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
 
            for (auto* body : bodies)
                delete body;
        }break;
        case 4: {
            return 0;
 
        }; break;
        }
    }
        while (e != 7);
    
    Series series(100);
 
    series.Add(new Ball(3));
    series.Add(new Parallelepiped(1,2,2));
    series.Add(new Cone(2,3,3));
 
 
    for (int i=0; i < series.Size(); ++i)
        std::cout << series[i]->SurfaceArea() << std::endl;
    return 0;
}
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
//Series.h
#pragma once
#include "Body.h"
#include <iostream>
 
class Series 
{
public:
    Series(size_t cap)
        : m_bodies(new Body *[cap])
    {
    }
    ~Series()
    {
        for (int i = 0; i < m_sz; ++i)
            delete m_bodies[i];
 
        delete[] m_bodies;
    }
    void Add(Body* body)
    {
        m_bodies[m_sz++] = body;
    }
    size_t Size() const;
    Body* operator[](size_t idx)
    {
        return m_bodies[idx];
    }
protected:
    Body **m_bodies;
    size_t m_sz = 0;
};
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.02.2020, 17:58
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
size_t Size() const;
    Body* operator[](size_t idx)
    {
        return m_bodies[idx];
    }
А где реализация Size()?
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
24.02.2020, 18:00  [ТС]
Упс. Да. Она должна же возвращать значение как понимаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2020, 18:00

Абстрактные классы
Есть 3 абстракции, линия(бесконечная), луч(бесконечен в одну сторону) и отрезок (ограничен). Разобрать иерархию классов. Срочно код...

абстрактные классы
компилятор ругается когда я пытаюсь записать объект класса!!!! подскажите что я не правильно делаю!! #include &lt;cstdlib&gt; ...

Абстрактные классы
Народ, вопрос есть такой. Есть абстрактный класс class A { protected: int a; public: A(int b=0):a(b) {

Абстрактные классы
Помогите плиз, экзаменационное задание, а разобраться не могу с ним: Создать консольное приложение, в котором реализовать работу...

Абстрактные классы
Помогите пожалуйста, сообразить не могу. Есть абстрактный класс. У него есть метод, чтение из файла. Есть производный от него класс....


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 27.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
Как замкнутый ядерный цикл решит проблему недостатки фосфора? Био миграция фосфора со дна океана
anaschu 26.06.2026
Биологический лифт: Концепция подъема фосфора со дна океана с помощью ЗЯТЦ Предлагаю на обсуждение альтернативу тяжелому промышленному бурению океанического дна. Вместо сложной инженерии мы можем. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru