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

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

Восстановить пароль Регистрация
 
Newchap
4 / 4 / 1
Регистрация: 17.09.2013
Сообщений: 179
19.05.2014, 16:22     Перегрузка операторов, если класс содержит массив #1
Добрый день, требовалось написать прогу, которая выводит количество повторений элементов в массиве, причем сделать это требовалось с помощью объектов, т.е. должно быть два объекта поставщика, один из них для ввода с клавы, а другой чтения с файла. и есть Объект чей метод подсчета получает информацию от данных объектов поставщиков.

Собственно, большинство я сделал, и прога работает, но хотелось бы чтобы операторы были перегружены, т.е. я писал не 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BRcr
 Аватар для BRcr
4003 / 2292 / 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
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.05.2014, 16:57     Перегрузка операторов, если класс содержит массив #4
Цитата Сообщение от Newchap Посмотреть сообщение
и что значит i(0) ?
Инициализация переменной. Эквивалент - int i = 0

У тебя же массивы переменных. Чтобы их сложить, нужно по отдельности сложить каждые соответствующие элементы массивов. Это цикл и делает.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,154
Завершенные тесты: 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++ Перегрузка операторов. Класс VECTOR
C++ Перегрузка операторов и абстрактный класс
C++ Перегрузка операторов. Класс String

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

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

Текущее время: 17:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru