Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147

Написать класс, который бы инкапсулировал массив окружности

26.10.2014, 20:55. Показов 947. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Вообщем писал программу, в которой цель была - написать класс, который бы инкапсулировал массив окружности.
Собственно говоря все есть:
C++ (Qt)
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
80
/*Класс исключения*/
class ArrayException
{
public:
    /*what - название для описания исключения*/
    ArrayException(const char * What)
    {
        if (What != NULL)
        {
            /*Копирование*/
            m_what = new char[strlen(What)];
            std::copy(What, What + strlen(What), m_what);
        }
    }
    /*Возвращает описание*/
    const char * what() const { return m_what; }
private:
    /*Строка с описанием исключительной ситуации*/
    char * m_what;
};
class CircleArray
{
public:
    /*m_size-размер массива*/
    unsigned int size(void) const { return m_size; }
 
    /*m_circles-указатель на массив окружностей.*/
    /*Размер массива передаётся в конструктор класса, а сам массив создаётся динамически.*/
    CircleArray(unsigned int size) : m_size(size), m_circles(NULL)
    {
        if (m_size == 0) m_circles = NULL;
        m_circles = new Circle[m_size];
    }
 
    /*Индексация.*/
    /*Одна константная (только для чтения), вторая неконстантная - позволяет менять содержимое элемента массива.*/
    Circle & operator[](unsigned int index)
    {
        if (index >= m_size)
            throw ArrayException("The index exceeds the massif size.");
        return m_circles[index];
    }
    const Circle & operator[](unsigned int index) const
    {
        if (index >= m_size)
            throw ArrayException("The index exceeds the massif size.");
        return m_circles[index];
    }
 
    /*Диструктор*/
    ~CircleArray()
    { 
    if (m_circles != NULL)
        delete [] m_circles;
    }
    /*Конструктор копирования для массива окружности*/
    CircleArray::CircleArray(const CircleArray& arr):m_size(arr.m_size), m_circles(new Circle[arr.m_size])
{
    for (unsigned int i = 0; i < m_size; i++) m_circles[i] = arr.m_circles[i];
}
 
    /*Перегрузка оператора присваивания*/
    CircleArray & CircleArray::operator = (const CircleArray& arr)
    {
        /*Освобождаем старую память*/
            if (this == &arr)
            return *this;
            if (m_circles != NULL)
            delete[] m_circles;
        /*Присваиваем значение новой памяти объекту*/
        m_size = arr.m_size;
        m_circles = new Circle[m_size];
        for (unsigned int i = 0; i < m_size; i++) m_circles[i] = arr.m_circles[i];
        return *this;
    }
private:
    /*unsigned - размер не может быть отрицательным*/
    unsigned int m_size;
    Circle * m_circles;
};
Тут все есть, что необходимо, но есть недостатки:
  • Преподаватель сказал, что нету какой-то проверки в конструкторе копирования.
  • При перегрузке оператора присваивания - тоже нету какой-то проверки, при этом он сказал, что память удаляется в самом начале (if (m_circles != NULL) delete[] m_circles, но как только я ее убрал: преподаватель сказал, что я сделал еще хуже .
Помогите дописать эти 2 пункта.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2014, 20:55
Ответы с готовыми решениями:

Написать класс, который создает и выводит массив
Помогите изменить этот код чтобы был класс который создает и выводит мой массив)7 #include &lt;iostream&gt; using namespace std; ...

Класс, полиморфизм (Написать класс, который хранит в себе некий номер ''nip'', проверит его на правильность и вывести результат)
Задача. Написать класс, который хранит в себе некий номер ''nip'', проверит его на правильность и вывести результат. Вообщем-то ни...

Класс, инкапсулирующий массив окружности
Вот такое задание дали &quot;Написать класс, который бы инкапсулировал массив окружности, там должен быть реализован конструктор, а также...

7
Студент
 Аватар для MickeyBlueEyes
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
26.10.2014, 22:51
Разве только эта проверка:
C++
1
if (arr.m_size != 0) {}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
26.10.2014, 23:05
конструктор копирования и оператор присвоения обычно одно и тоже
так что перепиши код в конструкторе как в операторе
Цитата Сообщение от Andrea13 Посмотреть сообщение
if (m_circles != NULL) delete[] m_circles
delete NULL
никаких действий не производит
так что if (m_circles != NULL) тавтология
достаточно просто написать
C++
1
delete[] m_circles;
Добавлено через 55 секунд
да и размер переданного класса проверяй как сказал MickeyBlueEyes,

Добавлено через 3 минуты
Цитата Сообщение от Andrea13 Посмотреть сообщение
C++
1
2
3
4
5
CircleArray(unsigned int size) : m_size(size), m_circles(NULL)
  {
     if (m_size == 0) m_circles = NULL;
     m_circles = new Circle[m_size];
   }
здесь у тебя circles уже инициализируется 0
а при размере 0 все равно вызовется new
перепиши так
C++
1
2
3
4
5
CircleArray(unsigned int size) : m_size(size), m_circles(NULL)
   {
         if (m_size != 0);
            m_circles = new Circle[m_size];
    }
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
27.10.2014, 12:34  [ТС]
if(arr.размермассива == this.размермассива) то тупо перекопировать данные, не удаляя память из this
иначе удалить память
выделить новую
и перекопировать
Сделал так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    CircleArray::CircleArray(const CircleArray& arr):m_size(arr.m_size)
    {
        if(arr.m_size == this.m_size)
        for (unsigned int i = 0; i < m_size; i++) arr.m_size[i] = this.m_size[i];
        else delete [] m_circles;
        /*Присваиваем значение новой памяти объекту*/
        m_circles = new Circle[m_size];
        m_size = arr.m_size;
        for (unsigned int i = 0; i < m_size; i++) m_circles[i] = arr.m_circles[i];
    }
Правильно? Ошибки выскакивают:
error C2228: выражение слева от ".m_size" должно представлять класс, структуру или объединение
1> тип: CircleArray *const
1> возможно, имеется в виду '->'
И так везде. Помогите доделать.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
27.10.2014, 14:27
Цитата Сообщение от Andrea13 Посмотреть сообщение
Правильно?
нет
1 если размеры равны то ты все равно выделяешь память
2
Цитата Сообщение от Andrea13 Посмотреть сообщение
arr.m_size[i] = this.m_size[i];
"кто на ком стоял" куда копируешь и что ?
что за массив m_size?
3
Цитата Сообщение от Andrea13 Посмотреть сообщение
:m_size(arr.m_size)
это зачем?
4 если arr.m_size равно 0 как себя поведет программа?
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
28.10.2014, 15:19  [ТС]
На самом деле там был написан полный бред. Позже его увидел. Сделал так:
C++ (Qt)
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
/*Конструктор копирования*/
CircleArray::CircleArray(const CircleArray& arr):m_size(arr.m_size)
{
if(arr.m_size != this->m_size)
{
delete [] m_circles;
/*Присваиваем значение новой памяти объекту*/
m_circles = new Circle[m_size];
m_size = arr.m_size;
}
for (unsigned int i = 0; i < m_size; i++) m_circles[i] = arr.m_circles[i];
}
/*Перегрузка оператора присваивания*/
CircleArray & CircleArray::operator = (const CircleArray& arr)
{
/*Освобождаем старую память*/
if (this == &arr) return *this;
if(arr.m_size != this->m_size)
{
delete [] m_circles;
/*Присваиваем значение новой памяти объекту*/
m_circles = new Circle[m_size];
m_size = arr.m_size;
}
for (unsigned int i = 0; i < m_size; i++) m_circles[i] = arr.m_circles[i];
return *this;
}
Но преподаватель здесь опять говорит, что есть ошибка. Точнее нету какой-то проверки. И вызвал эту ошибку в main'e:
C++ (Qt)
1
2
3
4
5
6
7
8
9
int main()
{
CircleArray circles(2);
circles[1] = Circle(1,2,3);
circles[0] = Circle(4,5,6);
 
CircleArray z = circles; //здесь начинается ужас. Эту ошибку исправить пока не удалось.
return 0;
}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
28.10.2014, 16:31
Цитата Сообщение от Andrea13 Посмотреть сообщение
Но преподаватель здесь опять говорит, что есть ошибка.
Цитата Сообщение от Andrea13 Посмотреть сообщение
m_circles = new Circle[m_size];
m_size = arr.m_size;
посмотри что происходит здесь
по шагам
0
3 / 3 / 3
Регистрация: 17.10.2012
Сообщений: 147
30.10.2014, 22:13  [ТС]
Я разобрался. Теперь возникла проблема с перегрузкой операторов +, += и <<.
Если работать без массивов, то получится вот такая простенькая перегрузка оператора +:
C++ (Qt)
1
2
3
4
5
6
7
    friend Circle operator+(const Circle& m1, const Circle& m2)
    {
        Circle temp = Circle();
        temp.setCenter(m1.getCenterX() + m2.getCenterX(), m1.getCenterY() + m2.getCenterY());
        temp.setRadius(m1.getRadius() + m2.getRadius());
        return temp;
    }
Как сделать тоже самое, но только на массиве, для класса CircleArray, в моем случае?

Добавлено через 6 часов 1 минуту
Интересует только перегрузка <<
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.10.2014, 22:13
Помогаю со студенческими работами здесь

Класс: Нужно написать класс,который будет вычислять заданную функцию...
Нужно написать класс,который будет вычислять вот такую функцию y= \sqrt{1/x^n} , также приложу картинку для удобства. x и n - параметры.

Создать класс Круг. Написать методы расчета площади и длины окружности
Создать класс Круг. Описать его двумя полями: радиус, диаметр. Введенное может быть дробным.Написать два метода которые будут выводить на...

Создать класс, который принимает на вход массив чисел, число N и выводит количество вхождений числа N в массив
создать класс, который принимает на вход массив чисел, число N и выводит количество вхождений числа N в массив

Написать класс который реализует методы
Написать класс Box, который реализует методы : Закрыть, Открыть, Заблокировать Реализовать класс Сейф, который наследует класс Box ,та...

Написать класс С++, который использует функции из библиотеки с
Есть С длл как написать класс С++, который использует функции из библиотеки с? Добавлено через 37 минут это нужно писать обертку?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью 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. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru