Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
1

Перегрузка "оператора +" для сложения массива объектов

06.11.2013, 19:32. Показов 2187. Ответов 10
Метки нет (Все метки)

Как перегрузить правильно оператор+ в данном случае или так делать нельзя? Ещё как-то туда надо передать размеры этого массива... и как записать
C++
1
 result.(*b[j])=*(b[j]+i)+input.*(b[j]+i);
не понимаю)

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
#include <iostream>
#include "Test.h"
#include <cstdlib>
 
using namespace std;
 
Test::Test(int x, int y)
{
sizeX=x;
sizeY=y;
b=new int*[sizeY];
}
 
void Test::set()
{
    for (int j=0;j<sizeY;j++)
    {
        int *a=new int[sizeX];
        for (int i=0;i<sizeX;i++)
        {
        a[i]=1+rand()%9;
        //cout<<a[i]<<" ";
        }
    b[j]=&a[0];
    //cout<<endl;
    }
}
 
void Test::print()
{
    for (int j=0;j<sizeY;j++)
    {
        for (int i=0;i<sizeX;i++)
        cout<<*(b[j]+i)<<" ";
    cout<<endl;
    }
}
 
Test operator+(const Test &input)
{
Test result;
    for (int j=0;j<3;j++)
    {
        for (int i=0;i<3;i++)
        result.(*b[j])=*(b[j]+i)+input.*(b[j]+i);
    }
}
 
Test::~Test()
{
delete []a;
delete []b;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2013, 19:32
Ответы с готовыми решениями:

Перегрузка "+" для сложения объектов
Здравствуйте, решил перегрузить оператор сложения для двух объектов, но появилась проблема,...

Перегрузка оператора "++" и "--" в чем может быть причина нарушение прав доступа?
Вот такой вот код #include &lt;iostream&gt; class d { private: int size ; char *n; public: ...

Перегрузка оператора "<<" для вывода пользовательских классов
Всем доброго времени суток. Пытаюсь сделать перегрузку оператора &quot;&lt;&lt;&quot; для того, чтобы можно было...

Перегрузка оператора "++" и "--" , компилирует, но при запуске программы - ошибка
#include &lt;iostream&gt; #include&lt;ctime&gt; #include&lt;stdio.h&gt; #include&lt;locale.h&gt; #include &lt;windows.h&gt;...

10
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 19:38 2
dzrkot, а можно еще и заголовочек увидеть?(Test.h покажите)
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
06.11.2013, 19:42  [ТС] 3
Цитата Сообщение от metaluga145 Посмотреть сообщение
dzrkot, а можно еще и заголовочек увидеть?(Test.h покажите)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef TEST_H
#define TEST_H
class Test
{
    public:
        Test();
        Test(int,int);
        Test operator+(const Test &);
        void set();
        void print();
        ~Test();
    private:
    int sizeY,sizeX;
    int *a;
    int **b;
};
#endif // TEST_H
0
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 19:48 4
dzrkot, вы не можете обращаться к полям a, b, sizeY и sizeX, которые принадлежат другому объекту, потому что они приватны.
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
06.11.2013, 19:54  [ТС] 5
Цитата Сообщение от metaluga145 Посмотреть сообщение
dzrkot, вы не можете обращаться к полям a, b, sizeY и sizeX, которые принадлежат другому объекту, потому что они приватны.
ну это я уже решил, что-то пропустил что оператор не относится к классу, добавил Test::, и sizeY и sizeX н ормально передаются. Записать не могу result.(*(b[j]+i))= .... синтаксиса не понимаю...
0
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 20:01 6
dzrkot, объект input и result содержат свои приватные поля, к которым доступ извне запрещен. Понимаете в чем подвох?
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
06.11.2013, 20:02  [ТС] 7
Цитата Сообщение от metaluga145 Посмотреть сообщение
dzrkot, объект input и result содержат свои приватные поля, к которым доступ извне запрещен. Понимаете в чем подвох?
хм...понял...а как-то это можно обойти?

стоп, я сомневаюсь.
обычный перегруженный оператор+ имеет доступ к приватным данным
0
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 20:12 8
dzrkot, ну я вроде как обходил через protected, вместо private.

Добавлено через 6 минут
Я написал вот такой код, это почти то же самое, что у Вас, только вместо класса, я использовал структуру!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <string.h>
#include <iostream>
using namespace std;
 
struct test{
    int **a;
};
 
int main()
{
    test temp;
    temp.a = new int * [1];
    temp.a[1] = new int [3];
    for (int i = 0; i<3;++i)
        temp.a[1][i]=i;
    cout<<temp.a[1][2]<<endl;
    
    system("pause");
    return 0;
}
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
06.11.2013, 20:17  [ТС] 9
через структуру неинтересно)) я для себя делаю это)


вот и всё, я перемудрил что-то...
C++
1
*(result.b[j]+i)=*(b[j]+i)+*(input.b[j]+i);
0
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 20:21 10
Так не хотите? Просто так удобней читать,чем через указатели)
C++
1
result.b[j][i] = b[j][i]+input.b[j][i]
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
06.11.2013, 22:07  [ТС] 11
хм...вроде прокатывает, но всёравно что-то не работает...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef TEST_H
#define TEST_H
class Test
{
    public:
        Test();
        Test(int,int);
        Test operator+(const Test &);
        void set();
        void print();
        ~Test();
    private:
    int sizeY,sizeX;
    int *a;
    int **b;
};
#endif // TEST_H

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
#include <iostream>
#include "Test.h"
#include <cstdlib>
 
using namespace std;
 
Test::Test(int x, int y)
{
sizeX=x;
sizeY=y;
b=new int*[sizeY];
}
 
void Test::set()
{
    for (int j=0;j<sizeY;j++)
    {
        int *a=new int[sizeX];
        for (int i=0;i<sizeX;i++)
        {
        a[i]=1+rand()%9;
        //cout<<a[i]<<" ";
        }
    b[j]=&a[0];
    //cout<<endl;
    }
}
 
void Test::print()
{
    for (int j=0;j<sizeY;j++)
    {
        for (int i=0;i<sizeX;i++)
        cout<<*(b[j]+i)<<" ";
    cout<<endl;
    }
}
 
Test Test::operator+(const Test &input)
{
Test result(sizeX,sizeY);
    for (int j=0;j<sizeY;j++)
    {
        for (int i=0;i<sizeX;i++)
        result.b[j][i]=b[j][i]+input.b[j][i];
        //*(result.b[j]+i)=*(b[j]+i)+*(input.b[j]+i);
    }
    return result;
}
 
Test::~Test()
{
delete []a;
delete []b;
}

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
#include <iostream>
#include<cstdlib>
#include <ctime>
#include "Test.h"
using namespace std;
 
int main()
{
srand(time(0));
 
Test obj1(3,5);
obj1.set();
cout<<endl;
obj1.print();
Test obj2(3,5);
obj2.set();
cout<<endl;
cout<<endl;
obj2.print();
cout<<endl;
Test obj3(3,5);
obj3=obj1+obj2;
obj3.print();
    return 0;
}
Добавлено через 17 минут
что-то с памятью походу...

Добавлено через 8 минут
конструктор копирования надо!

Добавлено через 6 минут
добавил конструктор, всёравно не работает((

C++
1
2
3
4
5
6
7
8
Test::Test(const Test &copy)
{
sizeX=copy.sizeX;
sizeY=copy.sizeY;
b=new int*[sizeY];
    for (int j=0;j<sizeY;j++)
    b[j]=copy.b[j];
}
Добавлено через 2 минуты
ошибка в операторе+ где-то, без него не ругается

Добавлено через 1 час 0 минут
Решил, проблема была в деструкторе, т.к. удалялись а и б, и ещё добавил заполнение нулями result

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Test Test::operator+(const Test &input)
{
Test result(sizeX,sizeY);
result.set(0);
    for (int j=0;j<sizeY;j++)
    {
        for (int i=0;i<sizeX;i++)
        result.b[j][i]=b[j][i]+input.b[j][i];
        //*(result.b[j]+i)=*(b[j]+i)+*(input.b[j]+i);
    }
    return result;
}
 
Test::~Test()
{
 
}
Добавлено через 4 минуты
я там set() перегрузил если что)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2013, 22:07

Определение класса, описывающего комплексное число. Перегрузка для него бинарного оператора "*"
1. Определить класс, описывающий комплексное число. Для класса перегрузить бинарный оператор *....

Перегрузка оператора "=" для AnsiString
Вообщем необходимо сделать перегрузку для формирования строки и присваивания ее в переменную типа...

Класс "Матрица". Перегрузка оператора "минус"
Помогите дописать программу или исправить ее. Нужно было написать программу, где создать класс...

Класс "Дробь". Перегрузка оператора "=="
template &lt;class T&gt; void polynomial&lt;T&gt;::refresh(){ //отбрасывающую старшие члены полинома с...


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

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

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