Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
#1

Перегрузка операторов, если класс содержит массив - C++

19.05.2014, 16:22. Просмотров 262. Ответов 6
Метки нет (Все метки)

Добрый день, требовалось написать прогу, которая выводит количество повторений элементов в массиве, причем сделать это требовалось с помощью объектов, т.е. должно быть два объекта поставщика, один из них для ввода с клавы, а другой чтения с файла. и есть Объект чей метод подсчета получает информацию от данных объектов поставщиков.

Собственно, большинство я сделал, и прога работает, но хотелось бы чтобы операторы были перегружены, т.е. я писал не a.mas= ,а просто a =. Перегрузки операторов я уже делал, но не могу понять, что делать если нужно элемент массив(надеюсь понятно выразился).

Снизу код, проблема возникает где мы перегружаем оператор +, скажите пожалуйста, как сделать так чтобы происходила сложение элементов массивов.

Буду очень признателен!

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// laba2oop.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
#pragma warning(disable : 4996)
int n;
 
class delivery {
public:     
   int *mas = new int[n]; 
   // перегружаем операторы
   delivery operator+(delivery &t);
   delivery operator=(delivery &t);
   delivery operator==(delivery &t);
   delivery operator>(delivery &t);
   delivery operator!=(delivery &t);
};
 
delivery delivery::operator+(delivery &t)
{
    delivery temp; 
    temp.mas = mas + t.mas;  
    return temp;
}
 
 
class keyboarddelivery : public delivery
{
public:
    void enterarray() {
        for (int i = 0; i < n; i++)  cin >> mas[i]; 
    }
};
 
class readdeliver : public delivery
{
    void read()
    {
        int i = 0;
        FILE *f1;
        f1 = fopen("array.txt", "r");
        if (!f1) cout << "file not opened";
        while (!EOF) { fscanf(f1, "%d", &mas[i]); i++; }
       fclose(f1);
    }
};
 
 
class account {              // считает частоту данных в массиве   
    int **mas2 = new int*[2]; 
    
public:
    void count(keyboarddelivery &a)  // здесь метод счета
       { 
        for (int count = 0; count < n; count++)
            mas2[count] = new int[n]; // и n столбцов   
    
 
            for (int j = 0; j < n; j++)
            {
                mas2[j][0] = a.mas[j];
                mas2[j][1] = 1;
            }   
 
// сортируем массив, счетчик изначально равен Н, 
        for (int i = n-1 ; i >= 0; i--)
        {
            for (int j = 0; j < i; j++)
            {
                if (a.mas[j] > a.mas[j + 1])
                {
                    int tmp = a.mas[j];
                    a.mas[j] = a.mas[j + 1];
                    a.mas[j + 1] = tmp;
                }
            }
        }
        for (int i = 0; i < n; i++)  // счетчик работает.
        {
            for (int j = 0; j < n; j++)
            {
                if ((a.mas[i] == a.mas[j]) && (i != j))
                    mas2[i][1] = mas2[i][1] + 1;
            }
        }
    // счетчик
     // исправно
            // вывод неповторяющихся элементов
            for (int j = 0; j < n; j++) {
                if (a.mas[j] != a.mas[j + 1])
                    cout << a.mas[j];
                if (j == n)
                    cout << a.mas[j];
            }
            cout << endl;
            // вывод счетчиков элементов,
            for (int j = 0; j < n; j++) {
                if (a.mas[j] != a.mas[j + 1])
                    cout << mas2[j][1];
                if (j == n )
                 cout << mas2[j][1];    
            }
 
             cout << endl;       
        for (int i = 0; i<2; i++)
            delete[] mas2[i];
    
 
 
       }
    void count(readdeliver &a)
       {
 
 
       }
};
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{   
    cout << "enter number of digits in array";
    cin >> n;
    keyboarddelivery Z;
    Z.enterarray();
    account AC;
    AC.count(Z);
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2014, 16:22     Перегрузка операторов, если класс содержит массив
Посмотрите здесь:
C++ Класс "динамический массив", перегрузка операторов +, =
C++ Перегрузка операторов. Класс VECTOR
C++ Перегрузка операторов. Класс String
Класс многочлен, перегрузка операторов C++
C++ Перегрузка операторов и абстрактный класс
C++ Класс описывающий матрицу. Перегрузка операторов
C++ Перегрузка операторов сравнения и разницы. Класс String
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BRcr
4007 / 2296 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.05.2014, 16:45     Перегрузка операторов, если класс содержит массив #2
C++
1
2
3
4
5
6
delivery delivery::operator+(delivery &t)
{
    delivery temp; 
    for ( int i( 0 ); i < n; temp.mas[i] = mas[i] + t.mas[i], ++i );  
    return temp;
}
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
19.05.2014, 16:48  [ТС]     Перегрузка операторов, если класс содержит массив #3
BRcr, Большое спасибо, но не могли бы пояснить смысл этого выражения и как это дело работает?
не могу врубится че-то, почему циклом и что значит i(0) ?
BRcr
4007 / 2296 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.05.2014, 16:57     Перегрузка операторов, если класс содержит массив #4
Цитата Сообщение от Newchap Посмотреть сообщение
и что значит i(0) ?
Инициализация переменной. Эквивалент - int i = 0

У тебя же массивы переменных. Чтобы их сложить, нужно по отдельности сложить каждые соответствующие элементы массивов. Это цикл и делает.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 1
19.05.2014, 17:15     Перегрузка операторов, если класс содержит массив #5
Наследовать тут вроде нечего:
Не думаю, что добавление всего одного нового метода должно служить основанием
для создания производного класса.
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include<iostream>
#include<fstream>
#include <cmath>
using namespace std;
 
class delivery {
protected:
   int *mas;
    int n;
public:     
    delivery():n(0) // конструктор по умолчанию
    {
        mas=0;
    }
    delivery(int n0):n(n0)
    {
        mas=new int[n0];
        for(int i=0;i<n;i++)
            mas[i]=0;
    }
    delivery(const delivery& dd):n(dd.n) // копиконструктор
    {
        mas=new int[dd.n];
        for(int i=0;i<n;i++)
            mas[i]=dd.mas[i];
    }
 
    ~delivery(){delete[] mas;}
   delivery& operator=(delivery &t);// возвращает ссылку
   // перегружаем операторы
   delivery operator+(delivery &t);
   //delivery operator==(delivery &t);
   //delivery operator>(delivery &t);
   //delivery operator!=(delivery &t);
    void enterarray();
    void displayarray();
 
    void read(char* filename);
    void count();
};
 
    void delivery::enterarray() {
        for (int i = 0; i < n; i++)  cin >> mas[i]; 
    }
    void delivery::displayarray() {
        for (int i = 0; i < n; i++)  
            cout << mas[i]<<" ";
        cout<<endl;
    }
    void delivery::read(char* filename)
    {
        ifstream f1(filename);
        if (!f1) 
            cout << "file not opened";
        else
           for(int i=0;i<n && !f1.eof();i++)
                f1>>mas[i];
       f1.close();
    }
delivery& delivery::operator=(delivery& dd)
{
    if(mas)
        delete[] mas;
    mas=new int[dd.n];
    for(int i=0;i<n;i++)
        mas[i]=dd.mas[i];
    return *this;
}
delivery delivery::operator+(delivery &t)
{
    delivery temp(*this); 
    for(int i=0;i<n;i++)
        temp.mas[i] += t.mas[i];  
    return temp;
}
 
 void delivery::count()  // здесь метод счета
    { 
        int** mas2=new int*[2];
        for (int j = 0; j < 2; j++)
            mas2[j] = new int[this->n]; // и n столбцов   
        for (int j = 0; j < n; j++)
        {
                mas2[0][j] = this->mas[j];
                mas2[1][j] = 1;
        }   
 
// сортируем массив, счетчик изначально равен Н, 
        for (int i = n-1 ; i >= 0; i--)
        {
            for (int j = 0; j < i; j++)
            {
                if (this->mas[j] > this->mas[j + 1])
                {
                    int tmp = this->mas[j];
                    this->mas[j] = this->mas[j + 1];
                    this->mas[j + 1] = tmp;
                }
            }
        }
        for (int i = 0; i < n; i++)  // счетчик работает.
        {
            for (int j = 0; j < n; j++)
            {
                if ((this->mas[i] == this->mas[j]) && (i != j))
                    mas2[1][i] = mas2[1][i] + 1;
            }
        }
    // счетчик
     // исправно
            // вывод неповторяющихся элементов
            for (int j = 0; j < n; j++) {
                if (this->mas[j] != this->mas[j + 1])
                    cout << this->mas[j]<<" ";
                if (j == n)
                    cout << this->mas[j]<<" ";
            }
            cout << endl;
            // вывод счетчиков элементов,
            for (int j = 0; j < n; j++) {
                if (this->mas[j] != this->mas[j + 1])
                    cout << mas2[1][j]<<" ";
                if (j == n )
                 cout << mas2[1][j]<<" ";    
            }
 
             cout << endl;       
        for (int i = 0; i<2; i++)
            delete[] mas2[i];
        delete[] mas2;
 }
 
int main()
{   
    cout << "enter array size:";
    int nn;cin >> nn;
    delivery Z(nn);
    Z.enterarray();
    Z.displayarray();
    Z.count();
    Z.displayarray();
    system("pause");
    return 0;
}
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
19.05.2014, 21:51  [ТС]     Перегрузка операторов, если класс содержит массив #6
zss, Это наследование часть задания, не более.)

Добавлено через 4 часа 28 минут
zss, BRcr, Я признателен за вашу помощь, в частности за то, что предложил ZSS, но все-таки хотел бы просто доработать свой изначальный вариант.
Вроде перегрузил остальные операторы как сказал BRcr, но как мне теперь сделать так, чтобы в функции count я мог обращаться просто к а, а не к a.mas?

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// laba2oop.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
#pragma warning(disable : 4996)
int n;
 
class delivery {
public:     
   int *mas = new int[n]; 
   // перегружаем операторы
   delivery operator+(delivery &t);
   delivery operator=(delivery &t);
   bool operator==(delivery &t);
   bool operator>(delivery &t);
   bool operator!=(delivery &t);
};
 
delivery delivery::operator+(delivery &t)
{
    delivery temp; 
    for (int i = 0; i < n; i++) temp.mas[i] = mas[i] + t.mas[i];
    return temp;
}
delivery delivery::operator=(delivery &t)
{
    for (int i = 0; i < n; i++) mas[i] = t.mas[i];
    return *this;
}
bool delivery::operator==(delivery& t)
{
    for (int i = 0; i < n; i++)
    return this->mas[i] == t.mas[i];
}
bool delivery::operator>(delivery& t)
{
    for (int i = 0; i < n; i++)
        return this->mas[i] >t.mas[i];
}
bool delivery::operator!=(delivery& t)
{
    for (int i = 0; i < n; i++)
        return this->mas[i] != t.mas[i];
}
 
class keyboarddelivery : public delivery
{
public:
    void enterarray() {
        for (int i = 0; i < n; i++)  cin >> mas[i]; 
    }
};
 
class readdeliver : public delivery
{
    void read()
    {
        int i = 0;
        FILE *f1;
        f1 = fopen("array.txt", "r");
        if (!f1) cout << "file not opened";
        while (!EOF) { fscanf(f1, "%d", &mas[i]); i++; }
       fclose(f1);
    }
};
 
 
class account {              // считает частоту данных в массиве   
    int **mas2 = new int*[2]; 
    
public:
    void count(keyboarddelivery &a)  // здесь метод счета
       { 
        for (int count = 0; count < n; count++)
            mas2[count] = new int[n]; // и n столбцов   
    
 
            for (int j = 0; j < n; j++)
            {
                mas2[j][0] = a.mas[j];
                mas2[j][1] = 1;
            }   
 
// сортируем массив, счетчик изначально равен Н, 
        for (int i = n-1 ; i >= 0; i--)
        {
            for (int j = 0; j < i; j++)
            {
                if (a.mas[j] > a.mas[j + 1])
                {
                    int tmp = a.mas[j];
                    a.mas[j] = a.mas[j + 1];
                    a.mas[j + 1] = tmp;
                }
            }
        }
        for (int i = 0; i < n; i++)  // счетчик работает.
        {
            for (int j = 0; j < n; j++)
            {
                if ((a.mas[i] == a.mas[j]) && (i != j))
                    mas2[i][1] = mas2[i][1] + 1;
            }
        }
    // счетчик
     // исправно
            // вывод неповторяющихся элементов
            for (int j = 0; j < n; j++) {
                if (a.mas[j] != a.mas[j + 1])
                    cout << a.mas[j];
                if (j == n)
                    cout << a.mas[j];
            }
            cout << endl;
            // вывод счетчиков элементов,
            for (int j = 0; j < n; j++) {
                if (a.mas[j] != a.mas[j + 1])
                    cout << mas2[j][1];
                if (j == n )
                 cout << mas2[j][1];    
            }
 
             cout << endl;       
        for (int i = 0; i<2; i++)
            delete[] mas2[i];
    
 
 
       }
    void count(readdeliver &a)
       {
 
 
       }
};
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{   
    cout << "enter number of digits in array";
    cin >> n;
    keyboarddelivery Z;
    Z.enterarray();
    account AC;
    AC.count(Z);
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2014, 22:27     Перегрузка операторов, если класс содержит массив
Еще ссылки по теме:
C++ Класс строк, перегрузка операторов. Как вернуть объект класса
Перегрузка операторов для класса МАССИВ C++
C++ Класс "Дроби" и перегрузка операторов для этого класса
Класс "Матрица": конструктор, деструктор и перегрузка операторов C++
C++ Класс "Прямая". Перегрузка операторов

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

Или воспользуйтесь поиском по форуму:
BRcr
4007 / 2296 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.05.2014, 22:27     Перегрузка операторов, если класс содержит массив #7
Перегрузи оператор [], если я правильно понял вопрос...
Перегрузка оператора []
Yandex
Объявления
19.05.2014, 22:27     Перегрузка операторов, если класс содержит массив
Ответ Создать тему
Опции темы

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