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

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

Восстановить пароль Регистрация
 
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
06.11.2013, 19:32     Перегрузка "оператора +" для сложения массива объектов #1
Как перегрузить правильно оператор+ в данном случае или так делать нельзя? Ещё как-то туда надо передать размеры этого массива... и как записать
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2013, 19:32     Перегрузка "оператора +" для сложения массива объектов
Посмотрите здесь:

C++ Перегрузка оператора сложения
Перегрузка оператора ( ) для объектов класса C++
C++ Перегрузка оператора + для сложения двух экземпляров класса
Перегрузка оператора сложения C++
Перегрузка оператора сложения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 19:38     Перегрузка "оператора +" для сложения массива объектов #2
dzrkot, а можно еще и заголовочек увидеть?(Test.h покажите)
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
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
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 19:48     Перегрузка "оператора +" для сложения массива объектов #4
dzrkot, вы не можете обращаться к полям a, b, sizeY и sizeX, которые принадлежат другому объекту, потому что они приватны.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
06.11.2013, 19:54  [ТС]     Перегрузка "оператора +" для сложения массива объектов #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
dzrkot, вы не можете обращаться к полям a, b, sizeY и sizeX, которые принадлежат другому объекту, потому что они приватны.
ну это я уже решил, что-то пропустил что оператор не относится к классу, добавил Test::, и sizeY и sizeX н ормально передаются. Записать не могу result.(*(b[j]+i))= .... синтаксиса не понимаю...
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 20:01     Перегрузка "оператора +" для сложения массива объектов #6
dzrkot, объект input и result содержат свои приватные поля, к которым доступ извне запрещен. Понимаете в чем подвох?
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
06.11.2013, 20:02  [ТС]     Перегрузка "оператора +" для сложения массива объектов #7
Цитата Сообщение от metaluga145 Посмотреть сообщение
dzrkot, объект input и result содержат свои приватные поля, к которым доступ извне запрещен. Понимаете в чем подвох?
хм...понял...а как-то это можно обойти?

стоп, я сомневаюсь.
обычный перегруженный оператор+ имеет доступ к приватным данным
metaluga145
243 / 244 / 20
Регистрация: 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;
}
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
06.11.2013, 20:17  [ТС]     Перегрузка "оператора +" для сложения массива объектов #9
через структуру неинтересно)) я для себя делаю это)


вот и всё, я перемудрил что-то...
C++
1
*(result.b[j]+i)=*(b[j]+i)+*(input.b[j]+i);
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
06.11.2013, 20:21     Перегрузка "оператора +" для сложения массива объектов #10
Так не хотите? Просто так удобней читать,чем через указатели)
C++
1
result.b[j][i] = b[j][i]+input.b[j][i]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2013, 22:07     Перегрузка "оператора +" для сложения массива объектов
Еще ссылки по теме:

Перегрузка оператора сложения C++
Перегрузка оператора сложения C++
Перегрузка оператора +, для сложения координат 2х векторов C++

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

Или воспользуйтесь поиском по форуму:
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
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() перегрузил если что)
Yandex
Объявления
06.11.2013, 22:07     Перегрузка "оператора +" для сложения массива объектов
Ответ Создать тему
Опции темы

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