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

Не могу создать ссылку на объект в массиве - C++

Восстановить пароль Регистрация
 
SkaN2412
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 4
29.07.2013, 04:40     Не могу создать ссылку на объект в массиве #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
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
class Row {
    
public:
    Row(){}
    Row( int l )
    {
        arr = new double[l];
        length = l;
    }
    
    double &operator []( int pointer )
    {
        return arr[pointer];
    }
    
    double mean()
    {
        double sum = 0;
        
        for ( int i = 0; i < length; i++ )
        {
            sum += arr[i];
        }
        
        return ( sum / length );
    }
    
    int countNeg()
    {
        int count = 0;
        
        for ( int i = 0; i < length; i++ )
        {
            if ( arr[i] < 0 )
            {
                count++;
            }
        }
        
        return count;
    }
    
    void absolute()
    {
        for ( int i = 0; i < length; i++ )
        {
            if ( arr[i] < 0 )
            {
                abs( arr[i] );
            }
        }
    }
    
    ~Row()
    {
        delete []arr;
    }
    
private:
    double* arr;
    int length;
};
 
class Matrix {
    
public:
    Matrix(){}
    Matrix( int h, int w )
    {
        matrix = new Row[h];
        for ( int i = 0; i < h; i++ )
        {
            matrix[i] = new Row(w);
        }
        width = w;
    }
    
    Row &operator []( int pointer )
    {
        return matrix[pointer];
    }
    
    double mean()
    {
        double sum = 0;
        
        for ( int i = 0; i < width; i++ )
        {
            sum += matrix[i].mean();
        }
        
        return ( sum / width );
    }
    
    bool maxNeg()
    {
        int max, pretender, i;
        
        for ( i = 0; i < width; i++ )
        {
            if ( matrix[i].countNeg() > max )
            {
                max = matrix[i].countNeg();
                pretender = i;
            }
        }
        
        return max;
    }
    
    void absolute()
    {
        for ( int i = 0; i < width; i++ )
        {
            matrix[i].absolute();
        }
    }
    
    ~Matrix()
    {
        delete []matrix;
    }
    
private:
    Row* matrix;
    int width;
};
Проблема в конструкторе второго класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
main.cpp: In constructor ‘Matrix::Matrix(int, int):
main.cpp:85:23: error: invalid user-defined conversion from ‘Row*’ to ‘const Row&[-fpermissive]
             matrix[i] = new Row(w);
                       ^
main.cpp:17:5: note: candidate is: Row::Row(int) <near match>
     Row( int l )
     ^
main.cpp:17:5: note:   no known conversion for argument 1 from ‘Row*’ to ‘int’
main.cpp:85:23: error: invalid conversion from ‘Row*’ to ‘int[-fpermissive]
             matrix[i] = new Row(w);
                       ^
main.cpp:17:5: error:   initializing argument 1 of ‘Row::Row(int)[-fpermissive]
     Row( int l )
     ^
Подозреваю, что где-то я накосячил с типами, но не могу понять где. Только начал учить плюсы, еще не знаю, как надо дебажить тут код, поэтому совсем не представляю, что делать все туториалы по ссылкам в инете показывают, что я все сделал правильно, но...
Полный скрипт можно скачать тут: http://ubuntuone.com/2HSwJJNP7f0Oa4io0yciST
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2013, 04:40     Не могу создать ссылку на объект в массиве
Посмотрите здесь:

C++ Не могу найти ошибку с подсчетом суммы элементов в интервале[a,b] в динамическом одномерном массиве массиве.
C++ Почему перегруженный оператор = должен возвращать ссылку на объект
C++ Как передать ссылку на объект в класс
C++ Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит
Присвоить ссылку на функцию, по ссылке на объект:) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,343
29.07.2013, 09:13     Не могу создать ссылку на объект в массиве #2
Цитата Сообщение от SkaN2412 Посмотреть сообщение
Row &operator []( int pointer )
Должно быть Row *
Цитата Сообщение от SkaN2412 Посмотреть сообщение
for ( int i = 0; i < h; i++ ) { matrix[i] = new Row(w); }
Это кажись тут лишнее.
Цитата Сообщение от SkaN2412 Посмотреть сообщение
~Matrix() { delete []matrix; }
Это верно.
Цитата Сообщение от SkaN2412 Посмотреть сообщение
Row(){}
Нужны значения по умолчанию - arr(nullptr) и т.п.
Цитата Сообщение от SkaN2412 Посмотреть сообщение
Matrix(){}
Аналогично
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
29.07.2013, 09:53     Не могу создать ссылку на объект в массиве #3
И совет на будущее поля класса начале, а потом методы, очень трудно, вначале ищешь поля, потом назад, что бы воткнуть в методы.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
29.07.2013, 10:06     Не могу создать ссылку на объект в массиве #4
Хотел бы обратить внимание на эту ф-ю:
C++
1
2
3
4
5
6
7
8
9
10
    void absolute()
    {
        for ( int i = 0; i < length; i++ )
        {
            if ( arr[i] < 0 )
            {
                abs( arr[i] );
            }
        }
    }
Модуль не кому не возвращается и не выводиться. Наверное вы имели ввиду это?:
C++
1
cout << abs( arr[i] ) << endl;
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 10:59     Не могу создать ссылку на объект в массиве #5
Цитата Сообщение от SkaN2412 Посмотреть сообщение
main.cpp:85:23: error: invalid user-defined conversion from ‘Row*’ to ‘const Row&’ [-fpermissive] matrix[i] = new Row(w);
все правильно тебе и написал, matrix является указателем вы создаете массив Row и сохраняете указатель в переменную matrix, обращаетесь к i-тому элементу и он возвращает вам Ссылку, на i-ый элемент, но в него вы пытаетесь записать указатель, который возвращает new, просто если у вас Row cтрока, то Вам нужно создать массив строк, а цикл не нужен
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
29.07.2013, 12:44     Не могу создать ссылку на объект в массиве #6
C++
1
2
3
4
5
6
7
8
9
  Matrix( int h, int w )
    {
        matrix = new Row[h];
        for ( int i = 0; i < h; i++ )
        {
            matrix[i] =Row(w);//без new!!!
        }
        width = h;//!!!!!
    }
Добавлено через 4 минуты
Но тут ВНИМАНИЕ!
то,, что я написал будет работать только, если класс Row написан верно.
У тебя же нету даже нормальных конструктора копирования и оператора присвоения в нём!
SkaN2412
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 4
29.07.2013, 21:29  [ТС]     Не могу создать ссылку на объект в массиве #7
Цитата Сообщение от Ilot Посмотреть сообщение
Модуль не кому не возвращается и не выводиться.
Правильно, просто все числа в матрице заменяются на их модуль и дальше уже идут операции с обновленной матрицей, все ок

Цитата Сообщение от nonedark2008 Посмотреть сообщение
Должно быть Row *
Это вываливается с кууучей ошибок.

Цитата Сообщение от aLarman Посмотреть сообщение
все правильно тебе и написал, matrix является указателем вы создаете массив Row и сохраняете указатель в переменную matrix, обращаетесь к i-тому элементу и он возвращает вам Ссылку, на i-ый элемент, но в него вы пытаетесь записать указатель, который возвращает new, просто если у вас Row cтрока, то Вам нужно создать массив строк, а цикл не нужен
чего?) matrix - массив типа Row, в конструкторе указывается, сколько строк в матрице, а потом в цикле каждой ячейке matrix присваивается ссылка на объект этого класса Row. а конструктору передается соответственно количество столбцов. ну это в идеале, а в суровой реальности просто ничего не работает )
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
30.07.2013, 12:52     Не могу создать ссылку на объект в массиве #8
Цитата Сообщение от SkaN2412 Посмотреть сообщение
C++
1
matrix[i] = new Row(w);
Цитата Сообщение от SkaN2412 Посмотреть сообщение
чего?) matrix - массив типа Row, в конструкторе указывается, сколько строк в матрице, а потом в цикле каждой ячейке matrix присваивается ссылка на объект этого класса Row. а конструктору передается соответственно количество столбцов. ну это в идеале, а в суровой реальности просто ничего не работает )
а нью разве не указатель возвращает? matrix[i] возвращает ссылку, а new Row(w) указатель, вот и не соответствие
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 13:17     Не могу создать ссылку на объект в массиве #9
Цитата Сообщение от Wolkodav Посмотреть сообщение
И совет на будущее поля класса начале, а потом методы, очень трудно, вначале ищешь поля, потом назад, что бы воткнуть в методы.
Моментально развидьте этот совет все, кто его видел. Классы, как и любой код, гораздо чаще читаются пользователями (кода, а не винды/компьютер/монитора), чем пишутся разработчиками. А пользователю нужен интерфейс класса, а не его внутреннее устройство.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
30.07.2013, 13:32     Не могу создать ссылку на объект в массиве #10
Fyret, чего? Вот лично я сейчас читал код, читать очень сложно, в начале вниз, потом вверх... А уж если на то пошло, то надо делить класс на .h and .cpp. А не кидать всё в одну кучу
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 13:38     Не могу создать ссылку на объект в массиве #11
Есть множество подходов к организации кода, это вопрос вкуса (к слову: пихание всего в хедер уменьшает число единиц трансляции и, как следствие, время компиляции. Минусов тоже хватает).

Но главное правило - код должен легко читаться пользователем. Пользователю внутренние данные не нужны.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
30.07.2013, 13:53     Не могу создать ссылку на объект в массиве #12
А на кой пользователю лазать в код? В код лазают, те кто его пишут...
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 14:00     Не могу создать ссылку на объект в массиве #13
Цитата Сообщение от Wolkodav Посмотреть сообщение
А на кой пользователю лазать в код? В код лазают, те кто его пишут...
Читайте сообщения внимательнее, пожалуйста.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
30.07.2013, 14:03     Не могу создать ссылку на объект в массиве #14
Fyret, понял... Туплю... Но писать код для себя, когда один чирикаешь, это одно, а когда пишешь в команде, надо и о других позаботиться. Да еще возможность прихода новых, и очень трудно, еще повторюсь, бегать по коду, искать в начале поля класса, а потом возвращаться к методам.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 14:12     Не могу создать ссылку на объект в массиве #15
Цитата Сообщение от Wolkodav Посмотреть сообщение
Но писать код для себя, когда один чирикаешь, это одно, а когда пишешь в команде, надо и о других позаботиться.
Wolkodav, именно, я об и говорю. Но класс, к примеру, поддерживает команда из 3-4 человек - им надо бегать от методов к данным и обратно. А пользуются классом 20, 30, 50 человек из других отделов, и им бегать не надо. Ну и кого больше? Чье удобство приоритетнее?
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
30.07.2013, 14:20     Не могу создать ссылку на объект в массиве #16
А коли пользуются они этими классами, то на кой им в класс лазить? Обозвали методы понормальному, входные параметры по человечески и пошли вперёд. Лично я за время разработки ниразу не лазил в коды методов( да боже упоси лезть в чужую логику без надобности) классов, а вот поля требовались.
SkaN2412
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 4
30.07.2013, 23:03  [ТС]     Не могу создать ссылку на объект в массиве #17
Цитата Сообщение от Wolkodav Посмотреть сообщение
А уж если на то пошло, то надо делить класс на .h and .cpp. А не кидать всё в одну кучу
каюсь, было влом ))

Добавлено через 3 часа 23 минуты
Решение:
matrix[i] = *(new Row(w));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2013, 23:21     Не могу создать ссылку на объект в массиве
Еще ссылки по теме:

C++ Как функции возвратить ссылку на объект?
C++ Как вернуть ссылку на объект?
C++ Создать объект стек и создать объект очередь с перегруженными операциями

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
30.07.2013, 23:21     Не могу создать ссылку на объект в массиве #18
Цитата Сообщение от SkaN2412 Посмотреть сообщение
matrix[i] = *(new Row(w));
1)утечка
2) создание одного ряда размером w

Добавлено через 5 минут
Решение:
1) Навести порядок в классе Row - определить конструктор копирования и оператор = по-нормальному, чтоб утечек не было!
Ибо http://ru.wikipedia.org/wiki/%D0%9F%...BD%D0%B8%D0%B5)
2) Конструктор матрицы будет выглядеть так:
C++
1
2
3
4
5
6
Matrix::Matrix( int h, int w ): width(w){
  Row element(h);
  matrix = new Row[w];
  for (int i=0; i<w; i++)
    matrix[i]=element;
}
Добавлено через 3 минуты
Цитата Сообщение от SkaN2412 Посмотреть сообщение
Row(){}
тоже безобразие. В конструкторе по-умолчанию ничего плохого нет, наоборот, хорошо, что имеется.
Но он ничего не инициализирует, а объекты, созданные с его помощью, будут деинициализироваться деструктором
C++
1
2
3
~Row(){
        delete []arr;
    }
И попытка delete[] для неинициализированного указателя будет плачевна.
Yandex
Объявления
30.07.2013, 23:21     Не могу создать ссылку на объект в массиве
Ответ Создать тему
Опции темы

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