2 / 2 / 3
Регистрация: 04.05.2015
Сообщений: 93
1

Перегрузка операторов для списков

13.10.2015, 19:41. Показов 6243. Ответов 14
Метки нет (Все метки)

Как сделать перегрузку оператора умножить (оператор возвращает адрес первого элемента списка нового списка, который содержит общие элементы обоих списков для которых вызывался оператор).
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2015, 19:41
Ответы с готовыми решениями:

Перегрузка операторов для класса
class A { private: size_t i; public: size_t i_get() { return i; } };

Перегрузка операторов не для объектов
Можно ли так делать? Потому что в таком случае вызывается не мой оператор, а исключающее или,...

Перегрузка операторов для list
Как перегрузить операторы вывода в поток и доступа по индексу для list?

Перегрузка операторов для матрицы
Изучая перегрузки операторов столкнулся с такой проблемой: По заданию нужно перегрузить "+", "-",...

14
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
13.10.2015, 19:48 2
Он должен возвращать сам новый список.
0
2 / 2 / 3
Регистрация: 04.05.2015
Сообщений: 93
13.10.2015, 19:53  [ТС] 3
nmcf, такое вот задание (написал как дали). Так поможете?
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
13.10.2015, 20:01 4
Что за список? Это класс? Как реализован?
0
2 / 2 / 3
Регистрация: 04.05.2015
Сообщений: 93
13.10.2015, 20:04  [ТС] 5
nmcf,
Как то так:
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
#include <iostream>
using namespace std;
 
class student                                                                       
{
    char ima[20];                                                                   
    int ozenka;                                                                 
public:
    student *next;                                                                  
 
    student(char *i, int o)                                                     
    {
        next = NULL;
        strcpy(ima, i);
        ozenka = o;
    }
 
    friend ostream& operator << (ostream& stream, student &s)                       
    {
        stream << s.ima << s.ozenka;
        return stream;
    }
 
    friend class group;                                                             
};
 
class group                                                                         
{
    Student* head;                                                                  
    Student* tail;                                                                  
    int count;                                                                      
public:
    group()                                                                         
    {
        head = NULL;
        tail = NULL;
        count = 0;
    }
    
    void AddStudent(char *name, int am)                                             
    {
        Student* tmp = new Student(name, am);
 
        if (head == NULL)                                                           
        {
            head = tail = tmp;
        }
        else
        {
            tail->next = tmp;
            tail = tmp;
        }
 
        count++;
    }
 
    int Size()
    {
        return count;
    }
};
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
13.10.2015, 20:08 6
Если создать новый список и вернуть указатель на head, то либо он будет недействительным, так как список уничтожится как локальный объект, либо, при динамическом создании списка, будет утечка памяти, так как указатель на сам список (group) будет утрачен.
0
2 / 2 / 3
Регистрация: 04.05.2015
Сообщений: 93
13.10.2015, 20:10  [ТС] 7
nmcf, можете написать код как считаете правильным.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
13.10.2015, 20:22 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    group operator * (const group &g)                                             
    {
        group result;
 
        Student *ls = head;
        while (ls != NULL)
        {
            Student *rs = g.head;
            while (rs != NULL)
            {
                 if (strcmp(ls->ima, rs->ima) == 0 && ls->ozenka == rs->ozenka)
                     result.AddStudent(ls->ima, ls->ozenka);
                 rs = rs->next;
            }
            ls = ls->next;
        }
 
        return result;
    }
Добавь ещё оператор присваивания и деструктор. Без них не будет работать.
0
2 / 2 / 3
Регистрация: 04.05.2015
Сообщений: 93
13.10.2015, 20:34  [ТС] 9
nmcf,
Цитата Сообщение от nmcf Посмотреть сообщение
Добавь ещё оператор присваивания и деструктор. Без них не будет работать.
Деструктор понятно как реализовать, а можете подсказать как реализовать оператор присваивания.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
13.10.2015, 21:05 10
C++
1
2
3
4
5
group &operator = (const group &g)
{
    //...
    return *this;
}
Внутри текущее содержимое списка удаляешь, и создаёшь новую цепочку - копию g.
0
2 / 2 / 3
Регистрация: 04.05.2015
Сообщений: 93
13.10.2015, 21:38  [ТС] 11
nmcf, а с перегрузкой оператора сложения (оператор возвращает адрес первого элемента списка нового списка, который содержит содержажит элементы обоих списков для которых вызывался оператор) не поможете?
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
13.10.2015, 21:42 12
Я же объяснил: возвращать адрес элемента (student) в операторах group нельзя. Это либо недействительный указатель, либо утечка памяти.
0
2 / 2 / 3
Регистрация: 04.05.2015
Сообщений: 93
13.10.2015, 21:43  [ТС] 13
nmcf, напишите код как считаете правильным. В данном случае.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
13.10.2015, 21:43 14
Возвращать надо новый group, а из него уже берёшь head. Структура такая же как у умножения, только элементы добавляй все из первого, затем все из второго.
0
2 / 2 / 3
Регистрация: 04.05.2015
Сообщений: 93
19.10.2015, 09:49  [ТС] 15
Цитата Сообщение от nmcf Посмотреть сообщение
Возвращать надо новый group, а из него уже берёшь head. Структура такая же как у умножения, только элементы добавляй все из первого, затем все из второго.
Ну а все же как это кодом выглядит?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2015, 09:49
Помогаю со студенческими работами здесь

Перегрузка операторов для классов
Определить класс описывающий вектор в пространстве. Для класса перегрузить префиксный унарный...

Перегрузка операторов для контейнера
Доброго времени суток. Просматривая STL, в ветке вектора наткнулся на такую интересную запись: ...

Перегрузка операторов для работы с матрицами
нужно перегрузить оператор + для сложения двух матриц. Всё сделал, и всё работет. class...

Перегрузка операторов для класса не работают
Условие задачи:Номиналы российских рублей могут принимать значения 1, 2, 5, 10, 50, 100, 500, 1000,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru