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

функция - друг - C++

Восстановить пароль Регистрация
 
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
29.05.2013, 23:48     функция - друг #1
Вообщем набиваю руку по конструкторам ,деструкторам и функциям - друзьям...
Вот придумал условие: Нужно найти сумму элементов в тех строка,где нет отрицательных элементов,но что-то у меня криво считает + после того как скомпилировалось всё,выбивает ошибку ,по-мойму что-то с выделением памяти:

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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
 
using namespace std;
 
class Array {
    int **massiv,str,stb,sum,N;
public : 
    Array (int n);
    ~Array ();
    friend void Run (Array x);
};
 
Array::Array (int n)
{
    N = n;
 
    massiv = new int *[N];
        for (int i = 0;i<N;i++)
            massiv[i] = new int [N];
 
        for (int i = 0;i<N;i++) {
            for (int j = 0 ;j<N;j++)    {
                massiv[i][j] = -10 + rand () % 21;
                cout<<setw (3)<<massiv[i][j];
            }
            cout<<endl;
        }
}
 
Array::~Array ()
{
    for (int i = 0;i<N;i++)
        delete [] massiv[i];
    delete [] massiv;
}
 
void Run (Array x)
{
    x.sum = 0;
    bool ok = false;
    for (int i = 0;i<x.N;i++)   {
        for (int j = 0;j<x.N;j++)   {
            if (x.massiv[i][j] > 0)
                ok = true;
        }
    }
 
    for (int i = 0;i<x.N;i++)   {
        for (int j = 0;j<x.N;j++)   {
            if (ok)
                x.sum += x.massiv[i][j];
            cout<<x.sum;
        }
        cout<<endl;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL,"Russian");
 
    int k;
 
    cout<<"Введите размер матрицы: ";
        cin>>k;
    Array ob (k);
 
    Run (ob);
 
    system ("pause");
    return 0;
}
Миниатюры
функция - друг  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
29.05.2013, 23:54     функция - друг #2
Как минимум тут void Run (Array x) создается копия объекта, после выхода из функции уничтожается, уничтожая данные оригинала, т.к. нет корректного конструктора копирования
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
29.05.2013, 23:57     функция - друг #3
Проблемы у тебя с деструктором: я не стал разбираться, что делает твой класс, но после того, как закоментил твой десткруктор - всё заработало.
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
29.05.2013, 23:58  [ТС]     функция - друг #4
C++
1
значит здесь или передать объект по ссылке,или создать конструктор копи...?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
30.05.2013, 00:00     функция - друг #5
отладчик нашёл крах именно в 37 строке после вызова delete [] massiv[i];

Добавлено через 1 минуту
Цитата Сообщение от faLek Посмотреть сообщение
значит здесь или передать объект по ссылке,или создать конструктор копи...?
Если в классе используется указатель, то как правило необходимо определить конструктор, конструктор копирования, деструктор и оператор присвоения.
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
30.05.2013, 00:08  [ТС]     функция - друг #6
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
 
using namespace std;
 
class Array {
    int **massiv,str,stb,sum,N;
public : 
    Array (int n);
    ~Array ();
    friend void Run (Array &x);
};
 
Array::Array (int n)
{
    N = n;
 
    massiv = new int *[N];
        for (int i = 0;i<N;i++)
            massiv[i] = new int [N];
 
        for (int i = 0;i<N;i++) {
            for (int j = 0 ;j<N;j++)    {
                massiv[i][j] = -10 + rand () % 21;
                cout<<setw (3)<<massiv[i][j];
            }
            cout<<endl;
        }
}
 
Array::~Array ()
{
    for (int i = 0;i<N;i++)
        delete [] massiv[i];
    delete [] massiv;
}
 
void Run (Array &x)
{
    x.sum = 0;
    bool ok = false;
    for (int i = 0;i<x.N;i++)   {
        for (int j = 0;j<x.N;j++)   {
            if (x.massiv[i][j] > 0)
                ok = true;
        }
    }
 
    for (int i = 0;i<x.N;i++)   {
        for (int j = 0;j<x.N;j++)   {
            if (ok)
                x.sum += x.massiv[i][j];
            cout<<x.sum;
        }
        cout<<endl;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL,"Russian");
 
    int k;
 
    cout<<"Введите размер матрицы: ";
        cin>>k;
    Array ob (k);
 
    Run (ob);
 
    system ("pause");
    return 0;
}
вот как вариант исправил...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
30.05.2013, 00:09     функция - друг #7
Цитата Сообщение от faLek Посмотреть сообщение
значит здесь или передать объект по ссылке,или создать конструктор копи...?
А лучше и то и другое чтобы присутствовало
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
30.05.2013, 00:17  [ТС]     функция - друг #8
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
[CPP]#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
 
using namespace std;
 
class Array {
    int **massiv,str,stb,sum,N;
public : 
    Array (int n);
    Array (const Array &x);
    ~Array ();
    friend void Run (Array &x);
};
 
Array::Array (const Array &xj)//добавил конструктор копии
{
    massiv = new int *[N];
    **massiv = **xj.massiv;
        for (int i = 0;i<N;i++)
            massiv[i] = new int [N];
 
}
 
Array::Array (int n)
{
    N = n;
 
    massiv = new int *[N];
        for (int i = 0;i<N;i++)
            massiv[i] = new int [N];
 
        for (int i = 0;i<N;i++) {
            for (int j = 0 ;j<N;j++)    {
                massiv[i][j] = -10 + rand () % 21;
                cout<<setw (3)<<massiv[i][j];
            }
            cout<<endl;
        }
}
 
Array::~Array ()
{
    for (int i = 0;i<N;i++)
        delete [] massiv[i];
    delete [] massiv;
}
 
void Run (Array &x)
{
    x.sum = 0;
    bool ok = false;
    for (int i = 0;i<x.N;i++)   {
        for (int j = 0;j<x.N;j++)   {
            if (x.massiv[i][j] > 0)
                ok = true;
        }
    }
 
    for (int i = 0;i<x.N;i++)   {
        for (int j = 0;j<x.N;j++)   {
            if (ok)
                x.sum += x.massiv[i][j];
            cout<<x.sum;
        }
        cout<<endl;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL,"Russian");
 
    int k;
 
    cout<<"Введите размер матрицы: ";
        cin>>k;
    Array ob (k);
 
    Run (ob);
 
    system ("pause");
    return 0;
}
До этого не понимал полностью ,где применять лучше конструктор копии,теперь все знания слились в цельную картину
И вопрос ещё один,в чём отличие вызова конструктора по копии и передача объекта по ссылке?[/CPP]

Добавлено через 57 секунд
Croessmah, вот это новенькое,о этом ещё ничего не видел,спасибо,учту
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
30.05.2013, 00:18     функция - друг #9
Цитата Сообщение от faLek Посмотреть сообщение
в чём отличие вызова конструктора по копии и передача объекта по ссылке?
Если без ссылки, то будет создана копия объекта.
Если передавать ссылку, то передаем ссылку(указатель) на объект. Если он не должен изменяться в функции, то лучше передавать const-ссылку
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
30.05.2013, 00:21  [ТС]     функция - друг #10
C++
1
void Run (const Array &x)
,наподобие такого?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
30.05.2013, 00:22     функция - друг #11
Цитата Сообщение от faLek Посмотреть сообщение
наподобие такого?
да. Только при этому нельзя вызывать не const-функции члены и присваивать данным объекта значения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2013, 00:33     функция - друг
Еще ссылки по теме:

C++ функция друг, перегрузка <<
Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений C++
Класс - друг C++

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

Или воспользуйтесь поиском по форуму:
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
30.05.2013, 00:33  [ТС]     функция - друг #12
угу ясно,а вот если только конструктор копии у меня вызывать,так будет выглядеть,как здесь присваивать занчение копии?
C++
1
2
3
4
5
6
7
8
Array::Array (const Array &xj)//добавил конструктор копии
{
    massiv = new int *[N];
    **massiv = **xj.massiv;//значение копии
        for (int i = 0;i<N;i++)
            massiv[i] = new int [N];
 
}
Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
Array::Array (const Array &xj)//добавил конструктор копии
{
    massiv = new int *[N];
    //**massiv = **xj.massiv;//значение копии
        for (int i = 0;i<N;i++) {
            massiv[i] = new int [N];
        for (int j = 0;j<N;j++) {
            **massiv = xj.massiv[i][j];
        }
    }
    
}
подправил
Yandex
Объявления
30.05.2013, 00:33     функция - друг
Ответ Создать тему
Опции темы

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