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

Реализовать перегрузку операций для класса Pvect

23.04.2020, 07:44. Показов 689. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include "stdafx.h"
 
class vect {
private:
 
public:
    friend class Pvect; // объявить новый класс  как друга
 
};
 
class Pvect {
private:
    vect *pv;
    int * pcurr; // указатель на текущий элемент
public:
    Pvect();
    Pvect(vect*); // инициализация от vect 
    Pvect(const Pvect &); // конструктор копирования
    operator++ (); // перейти к следующему элементу префиксный
    operator-- (); // перейти к предыдущему элементу префиксный
    operator++ (int);  // перейти к следующему элементу постфиксный
    operator-- (int);  // перейти к предыдущему элементу постфиксный
    operator= (const Pvect &); // оператор присваивания
    operator+=(int k); // смещение на k элементов вперед
    operator-=(int);  // смещение на k элементов назад
    operator+(int); // получение нового указателя на k элементов вперед
    operator-(int); // получение нового указателя на k элементов назад
    operator*(); // доступ к текущему элементу класса vect
    Pvect getfirst();  // установка на начало  класса vect
    Pvect getlast(); // установка на конец класса vect
    operator== (const Pvect&); // сравнение указателей: истина если указывают на один и тот же класс и на один и тот же элемент
    operator!= (const Pvect&); // сравнение указателей: истина если указывают на разные классы или на разные элементы одного класса
    operator<= (const Pvect&); // сравнение указателей: истина если указывают на один класс и указывает на элемент с номером меньшим или равным
    operator>= (const Pvect&); // сравнение указателей: истина если указывают на один класс и указывает на элемент с номером большим или равным
};
 
 
 
int main()
{
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.04.2020, 07:44
Ответы с готовыми решениями:

Реализовать класс для выполнения арифметических действий с дробями, включая конструкторы и перегрузку операций
Доброго времени суток!! Нужна помощь с заданием, необходимо скоро сдавать лабораторку:( Задание: Создать класс для представления...

Реализовать для класса перегрузку операции []
Всем привет. помогите ПЖ с условием: Создать несколько объектов (например, a и b) разработанного класса. Класс – вектор (одномерный...

Реализовать перегрузку operator+() для пользователского класса
Есть класс ДРОБЬ, его члены ЧИСЛИТЕЛЬ И ЗНАМЕНАТЕЛЬ, а методы - конструктор и методы вывода. исходные данные - 4 обычные дроби. мне нужно...

9
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
23.04.2020, 09:18
1. Где хотя бы прототип класса vect?
2. Почему для операторов Pvect не указаны типы возвращаемых значений?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 16
23.04.2020, 09:37  [ТС]
Annemesski,
C++
1
2
3
4
5
class vect { 
private:
 int *p;     //базовый указатель
 int num;    //число элементов 
}
0
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
23.04.2020, 10:31
Sergey Labetscy, поля - это хорошо, а методы у класса vect есть? Кто занимается выделением памяти, как присваиваются значения элементам массива?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 16
23.04.2020, 13:27  [ТС]
Annemesski,
C++
1
2
3
4
5
vect();            //создаёт массив размерности 10 
vect(int n);       //создаёт массив размерности n 
vect(const vect& v); //инициализация от vect 
vect(int a[], int n); //инициализация от массива 
~vect() { delete [] р; }
Добавлено через 2 часа 34 минуты
Annemesski,
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
class vect {
private: int* p;     //базовый указатель
         int num;    //число элементов
public:            //конструкторы и деструкторы 
 
    vect()  //создаёт массив размерности 10 
    {
        num = 10;
        p = new int[num];
        delete[] p;
    }
    vect(int n) //создаёт массив размерности n 
    {
        num = n;
        p = new int[num];
        delete[] p;
    }
    vect(const vect& v) //инициализация от vect
    {
        num = v.num;
        p = new int[num];
        {
            for (int i = 0; i < num; ++i)
                * (p + i) = *(v.p + i);
        }
        delete[] p;
    }
 
    ~vect()
    {
        p = nullptr;
        delete[] p;
    }
    friend class Pvect; // объявить новый класс  как друга
};
 
class Pvect {
private:
    vect* pv;
    int* pcurr; // указатель на текущий элемент
public:
    Pvect();
    Pvect(vect*); // инициализация от vect 
    Pvect(const Pvect&); // конструктор копирования
    Pvect& operator++ () { ++pcurr; return *this; } // перейти к следующему элементу префиксный
    Pvect& operator-- () { --pcurr; return *this; } // перейти к предыдущему элементу префиксный
    Pvect operator++ (int)  // перейти к следующему элементу постфиксный
    {
        const auto copy = *this;
        operator++();
        return copy;
    } 
    Pvect operator-- (int) // перейти к предыдущему элементу постфиксный
    {
        const auto copy = *this;
        operator--();
        return copy;
    }
}
Добавлено через 7 секунд
Annemesski,
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
class vect {
private: int* p;     //базовый указатель
         int num;    //число элементов
public:            //конструкторы и деструкторы 
 
    vect()  //создаёт массив размерности 10 
    {
        num = 10;
        p = new int[num];
        delete[] p;
    }
    vect(int n) //создаёт массив размерности n 
    {
        num = n;
        p = new int[num];
        delete[] p;
    }
    vect(const vect& v) //инициализация от vect
    {
        num = v.num;
        p = new int[num];
        {
            for (int i = 0; i < num; ++i)
                * (p + i) = *(v.p + i);
        }
        delete[] p;
    }
 
    ~vect()
    {
        p = nullptr;
        delete[] p;
    }
    friend class Pvect; // объявить новый класс  как друга
};
 
class Pvect {
private:
    vect* pv;
    int* pcurr; // указатель на текущий элемент
public:
    Pvect();
    Pvect(vect*); // инициализация от vect 
    Pvect(const Pvect&); // конструктор копирования
    Pvect& operator++ () { ++pcurr; return *this; } // перейти к следующему элементу префиксный
    Pvect& operator-- () { --pcurr; return *this; } // перейти к предыдущему элементу префиксный
    Pvect operator++ (int)  // перейти к следующему элементу постфиксный
    {
        const auto copy = *this;
        operator++();
        return copy;
    } 
    Pvect operator-- (int) // перейти к предыдущему элементу постфиксный
    {
        const auto copy = *this;
        operator--();
        return copy;
    }
}
0
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
23.04.2020, 13:59
Sergey Labetscy,
1. В копирующем конструкторе класса vect уберите delete[] - не надо освобождать память которую выделили для копирующего объекта, вы его скопировали и сразу убили.
2. Соблюдайте "правило триады": если определи хотя бы одно из трех - деструктор, копирующий конструктор, оператор присваивания - обязательно реализуйте два других. Сиречь: добавьте оператор присваивания для класса vect
C++
1
2
3
4
5
6
7
8
9
10
11
vect & operator=(const vect &other)
{
    if (this == &other)
        return *this;
    delete[] p;
    num = other.num;
    p = new int[num];
    for (int i = 0; i < num; ++i)
                * (p + i) = *(v.p + i);
    return *this;
}
3. В деструкторе класса vect не нужно занулять указатель на массив, с Вашей реализацией программа не упадет, но и память не будет освобождена, то есть произойдет утечка памяти.

Ну а дальше развивайте Pvect: префиксные и префиксные инкремент и декремент сделаны правильно, с чем возникают трудности? Сперва реализуйте конструкторы.
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 16
23.04.2020, 14:33  [ТС]
Annemesski, не знаю, как конструкторы реализовать
0
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
23.04.2020, 15:01
Sergey Labetscy, Вы же сделали конструкторы для vect, а тут еще проще:
1. Конструктор по умолчанию инициализирует оба поля Pvect vect* pv и int* pcurr нулевым указателем (nullptr)
2. Конструктор Pvect(vect *vector); инициализирует pv как указатель на класс vect передаваемый ему в качестве параметра, а pcurr инициализирует указателем на нулевой элемент массива, полем p класса vect. Так как Pvect является другом (friend) класса vect - ему доступны приватные члены класса vect, то есть в конструкторе Pvect можно сделать так:
C++
1
pcurr = vector->p;
или pcurr(vector->p) в списке инициализации.
3. В копирующем конструкторе Pvect(const Pvect &other); просто скопируйте оба указателя один в один из экземпляра переданного как параметр в копирующий объект.
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 16
23.04.2020, 15:51  [ТС]
Annemesski,
C++
1
2
3
4
5
6
7
Pvect() { pv = nullptr; pcurr = nullptr; };
Pvect(vect*v) { pcurr = v->p;}; // инициализация от vect
Pvect(const Pvect&vector)
    {
        pv = vector.pv;
        pcurr = vector.pcurr;
    }; // конструктор копирования
Добавлено через 32 минуты
А как остальное реализовать?
0
 Аватар для Annemesski
2676 / 1337 / 481
Регистрация: 08.11.2016
Сообщений: 3,703
23.04.2020, 15:54
Sergey Labetscy, в конструкторе с параметром забыли инициализировать поле pv
C++
1
Pvect(vect*v) { pv = v; pcurr = v->p;}
Теперь оператор разыменования operator*(), тут есть тонкий момент: можно вернуть сразу ссылку на элемент вектора и это будет правильно, но я рекомендую возвращать указатель на int - тогда при выходе за пределы вектора можно возвращать nullptr и анализировать его в коде:
Простая реализация:
C++
1
2
3
4
int & PVect::operator*()
{
    return *pcurr;
}
Реализация через указатель на int:
C++
1
2
3
4
5
6
int * PVect::operator*()
{
    if (pcurr - pv->vec < 0 || pcurr >= pv->vec + pv->mSize)
        return nullptr;
    return pcurr;
}
Вторая реализация дает возможность определить границы вектора не используя дополнительный метод возвращающий num, например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    vect vector(10);
    Pvect p_vec(&vector);
    for (int number = 0; p_vec != nullptr; ++p_vec, ++number)
        **p_vec = number; // два астерикса (**) потому что мы разыменовываем Pvec который возвращает указатель на int, а затем разымновываем указатель на int чтобы присвоить ему значение
 
    p_vec.getfirst();
    
    while (*p_vec)
        cout << **p_vec++ << " "; // также применям разыменование дважды.
    cout << endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.04.2020, 15:54
Помогаю со студенческими работами здесь

Реализовать для объектов данного класса перегрузку операции
Всем привет. Помогите пж с условием, не могу разобраться вот в этом ( (a=k и k=b)). получаются же одинаковые массивы, или я что-то не...

Реализовать перегрузку операций = и ==
Вообщем есть такое задание Создать 2 объекта a и b, разработанного класса – символьная строка, реализовать перегрузку операций = и == . ...

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

Реализовать перегрузку заданных операторов для пользовательского класса комплексных чисел
Нужно добавить операторы перегрузки для комплексных чисел, но я что-то вообще не догоняю как это сделать. На пикче полное задание. я...

Реализовать перегрузку оператора сложения пользовательского класса Ellipse для сложения двух полуосей эллипса
Нужно дополнить прогу конструктором\деструктором и перегруженой операцией, чтоб &quot;+&quot; делал сложение двух полуосей элипса: ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru