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

конструкторы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
14.09.2010, 19:29     конструкторы #1
Есть 2 проблемы:
1) Сказали сделать 2 конструктора: один по умолчанию, а другой-с параметрами. Какие должны быть параметры в моем конструкторе?(я так понимаю нужно как-то избавиться от private:i,j,n,m?)
2) Почему при данном выделении памяти( через malloc нужно по условию) "ложится" метод print();
Может для этого нужен конструктор копирования?
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
class matrix
{   
private:
 
        int m,n,i,j;
        int **matrica;
public: 
        matrix();
        matrix(параметры); //констр. с параметрами
        ~matrix(); 
        int get(int ,int);
        void print();
        void setSize();
};
 
matrix::matrix()
{ 
}
 
matrix::matrix( параметры)
{
    setSize();
    int**matrica=(int**)malloc(n*sizeof(int*));
    for(i=0;i<n;i++)
        matrica[i]=(int*)malloc(m*sizeof(int));
 
        for ( i = 0; i < n; i++)
               for ( j = 0; j < m; j++)
                        matrica[i][j] = rand() % 10;
}
 
 void matrix::setSize()
{
    int first;
    int second;
    cout<<"Enter first size: ";
    cin>>first;
    cout<<"Enter second size: ";
    cin>>second;
    n=first;
    m=second;
    system("cls");
 }
void matrix::print()
{
     for( i = 0; i < n; i++)
     {
         for(j = 0; j < m; j++)
               cout<<matrica[i][j]<<' ';
         cout<<"\n";
     }
}
 matrix::~matrix()
{
     for (i = 0; i < n; i++)
     free(matrica[i]);
free(matrica);
}
int matrix::get(int i,int j)
{
         if(i>=n||j>=m)
            return 0;
         cout<<matrica[i][j]<<'\n';
}
 
int main ()
{  
        system("cls");
        matrix object;
        object.print();
        int i, j;
        cout<<"\n get (i.j):"<<endl;
        cout<<"Enter i: ";
        cin>>i;
        cout<<"Enter j: ";
        cin>>j;
        if(object.get(i,j)==0)
           cout<<"i or j more or equal than n or m!\n";
        system("PAUSE");
        return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2010, 19:29     конструкторы
Посмотрите здесь:

Конструкторы C++
Конструкторы C++
C++ конструкторы
C++ конструкторы
Конструкторы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
15.09.2010, 22:50  [ТС]     конструкторы #21
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
В конструкторе по-умолчанию переменная matrica не инициализируется.
Во время удаления этого объекта вызывается free для указателя, который указывает неизвестно куда.
Т.е. мне нужно использовать очистку в другом месте, к примеру после выполнения ф-ции get() ?
Или как связать указатель и free в деструкторе.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
15.09.2010, 23:01     конструкторы #22
Цитата Сообщение от zhenya.ya Посмотреть сообщение
Т.е. мне нужно использовать очистку в другом месте, к примеру после выполнения ф-ции get() ?
Или как связать указатель и free в деструкторе.
Тебе нужно инициализировать поле matrica, хотя бы нулём.
В деструкторе нужно проверять, не является ли указатель нулевым. И только если нет - освобождать память под указателем. Либо перейти на new/delete - delete 0 не вызовет ошибки, и тебе не нужно плодить if'ы в коде.

Кстати, ф-ция get() не везде возвращает значение. Это значит, что в месте вызова ф-ция вернёт неопределённое значение из стека.
В том числе и ноль.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
15.09.2010, 23:21  [ТС]     конструкторы #23
так ли я сделал? (сильно в этом сомневаюсь) И что делжен тогда делать конструктор копирования в моем случае?
...
C++
1
2
3
4
5
6
matrix::matrix()
{
    matrica=NULL;
    int a;
    n=m=a=0;
}
...
...
C++
1
2
3
4
5
6
7
8
9
matrix::~matrix()
{
    if(matrica!=NULL)
    {
      for (int i = 0; i < n; i++)
     free(matrica[i]);
free(matrica);
    }
}
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
15.09.2010, 23:30     конструкторы #24
Цитата Сообщение от zhenya.ya Посмотреть сообщение
так ли я сделал?
В принципе, да.
По-большому счёту, стоило бы инициализацию членов класса запихнуть в список инициализации:
C++
1
2
3
matrix::matrix():matrica(NULL), n(0),m(0)
{
}
Нафига ты втиснул туда int a я не знаю
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
15.09.2010, 23:42  [ТС]     конструкторы #25
хм... тогда я не понимаю почему не работает
Срывается после завершения работы как и прежде.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
15.09.2010, 23:43     конструкторы #26
Цитата Сообщение от zhenya.ya Посмотреть сообщение
Срывается после завершения работы как и прежде
Ты operator = определил ?
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
16.09.2010, 00:04  [ТС]     конструкторы #27
я делал как Вы ранее предлогали, но безуспешно. Может у меня копирующий консруктор неправильно написан?

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
class matrix
{ 
private:
        int m,n;
        int **matrica;
public: 
         matrix();
         matrix(int);
        ~matrix(); 
         matrix(const matrix &);
        int get(int ,int);
        void print();
        void setSize();
};
matrix::matrix()
{
    matrica=NULL;
    n=m=0;
}
void matrix::setSize()
{
    int first;
    int second;
    cout<<"Enter first size: ";
    cin>>first;
    cout<<"Enter second size: ";
    cin>>second;
    n=first;
    m=second;
    system("cls");
 }
 
matrix::matrix(int b)
{  
    setSize();
 
int **matrica2=(int**)malloc(n*sizeof(int*));
for(int i=0;i<n;i++)
    matrica2[i]=(int*)malloc(m*sizeof(int));
 
        for (int i = 0; i < n; i++)
               for (int j = 0; j < m; j++)
                        matrica2[i][j] = rand() % 10;
matrica=matrica2;
 
 }
void matrix::print()
{
     for(int i = 0; i < n; i++)
     {
         for(int j = 0; j < m; j++)
               cout<<matrica[i][j]<<' ';
         cout<<"\n";
     }
}
 
 matrix::~matrix()
{
    if(matrica!=NULL)
    {
      for (int i = 0; i < n; i++)
     free(matrica[i]);
free(matrica);
    }
}
 
int matrix::get(int i,int j)
{
         if(i>=n||j>=m)
            return 0;
         cout<<matrica[i][j]<<'\n';
 
}
 
matrix::matrix(const matrix &A1)
{
    
 
    int **matrica=(int**)malloc(n*sizeof(int*));
    for(int i=0;i<n;i++)
        matrica[i]=(int*)malloc(m*sizeof(int));
 
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            matrica[i][j]=A1.matrica[i][j];
    cout<<"fewfwewfeger";
}
 
int main ()
{  
        system("cls");
      
        matrix ob(5);
        matrix object(ob);
        object.print();
        int i, j;
        cout<<"\n get (i.j):"<<endl;
        cout<<"Enter i: ";
        cin>>i;
        cout<<"Enter j: ";
        cin>>j;
        if(object.get(i,j)==0)
           cout<<"i or j more or equal than n or m!\n";
        system("PAUSE");
        return 0;
}
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
16.09.2010, 00:06     конструкторы #28
Конечно, неправильно.
Вы не инициализируете переменную класса matrica ))
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
16.09.2010, 00:42  [ТС]     конструкторы #29
а что должно стоять после знака & в копирующем конструкторе: matrix( const matrix &) ???
и что Вы имеете в виду под: " Вы не иниц. переменную класса matrica",- каким образом ее там можно инициализировать, если я же там новую память выделяю для матрицы?
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
16.09.2010, 00:47     конструкторы #30
Цитата Сообщение от zhenya.ya Посмотреть сообщение
каким образом ее там можно инициализировать, если я же там новую память выделяю для матрицы?
Вы выделяете память для локальной переменной.

Цитата Сообщение от zhenya.ya Посмотреть сообщение
а что должно стоять после знака & в копирующем конструкторе: matrix( const matrix &) ???
Название аргумента. У вас этом плане всё правильно, только переменные принято обьявлять со строчной буквы.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
16.09.2010, 01:20  [ТС]     конструкторы #31
C++
1
2
3
4
5
6
7
8
9
10
11
12
matrix::matrix(const matrix &a)
{
    int **matrica2=(int**)malloc(n*sizeof(int*));
    for(int i=0;i<n;i++)
        matrica2[i]=(int*)malloc(m*sizeof(int));
 
matrica=matrica2;
 
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            matrica[i][j]=a.matrica[i][j];  
}
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
16.09.2010, 01:31     конструкторы #32
Будьте проще

C++
1
2
3
4
5
6
7
8
9
matrix::matrix(const matrix &a)
{
    matrica = (int**)malloc( n * sizeof(int*) );
    for( int i = 0; i < n; ++i )
        matrica[i] = (int*)malloc( m * sizeof(int) );
    for( int i = 0; i < n; ++i )
        for( int j = 0; j < m; ++j )
            matrica[i][j] = a.matrica[i][j];
}
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
16.09.2010, 01:40  [ТС]     конструкторы #33
а как нужно в main заставить работать его? так?
C++
1
2
3
4
5
6
7
8
int main ()
{  
        system("cls");
        matrix abc;
        matrix ob(5);
        matrix object(ob);
        object.print();
...
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
16.09.2010, 01:44     конструкторы #34
Цитата Сообщение от zhenya.ya Посмотреть сообщение
а как нужно в main заставить работать его? так?
Кого вы хотите заставить работать?

Да, код в принципе правильный.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
16.09.2010, 01:49  [ТС]     конструкторы #35
ППс) а почему он не работает( код ) ?

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
class matrix
{ 
private:
        int m,n;
        int **matrica;
public: 
         matrix();
         matrix(int );
        ~matrix(); 
         matrix(const matrix &a);
        int get(int ,int);
        void print();
        void setSize();
};
matrix::matrix()
{
    matrica=NULL;
    n=m=0;
}
void matrix::setSize()
{
    int first;
    int second;
    cout<<"Enter first size: ";
    cin>>first;
    cout<<"Enter second size: ";
    cin>>second;
    n=first;
    m=second;
    system("cls");
 }
 
matrix::matrix(int b)
{  
    setSize();
 
int **matrica2=(int**)malloc(n*sizeof(int*));
for(int i=0;i<n;i++)
    matrica2[i]=(int*)malloc(m*sizeof(int));
 
        for (int i = 0; i < n; i++)
               for (int j = 0; j < m; j++)
                        matrica2[i][j] = rand() % 10;
matrica=matrica2;
 
 }
void matrix::print()
{
     for(int i = 0; i < n; i++)
     {
         for(int j = 0; j < m; j++)
               cout<<matrica[i][j]<<' ';
         cout<<"\n";
     }
}
 
 matrix::~matrix()
{
    if(matrica!=NULL)
    {
      for (int i = 0; i < n; i++)
     free(matrica[i]);
free(matrica);
    }
}
 
int matrix::get(int i,int j)
{
         if(i>=n||j>=m)
            return 0;
         cout<<matrica[i][j]<<'\n';
 
}
 
matrix::matrix(const matrix &a)
{
        matrica = (int**)malloc( n * sizeof(int*) );
        for( int i = 0; i < n; ++i )
                matrica[i] = (int*)malloc( m * sizeof(int) );
        for( int i = 0; i < n; ++i )
                for( int j = 0; j < m; ++j )
                        matrica[i][j] = a.matrica[i][j];
}
 
 
int main ()
{  
        system("cls");
        matrix abc;
        matrix ob(5);
        matrix object(ob);
        object.print();
        int i, j;
        cout<<"\n get (i.j):"<<endl;
        cout<<"Enter i: ";
        cin>>i;
        cout<<"Enter j: ";
        cin>>j;
        if(object.get(i,j)==0)
           cout<<"i or j more or equal than n or m!\n";
        system("PAUSE");
        return 0;
}
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
16.09.2010, 01:57     конструкторы #36
В конструкторе копирования должно быть ещё
C++
1
2
n = a.n;
m = a.m;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2010, 02:08     конструкторы
Еще ссылки по теме:

C++ Конструкторы
C++ Конструкторы C++
C++ Конструкторы С++

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

Или воспользуйтесь поиском по форуму:
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
16.09.2010, 02:08  [ТС]     конструкторы #37
" в рот мне ноги "!!! работает!!! Можно выдохнуть...
Что бы я без Вас делал. Огромное СПАСИБО.
Yandex
Объявления
16.09.2010, 02:08     конструкторы
Ответ Создать тему
Опции темы

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