Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 4
1

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

29.07.2013, 04:40. Показов 1308. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2013, 04:40
Ответы с готовыми решениями:

Как создать ссылку на объект?
Как сделать ссылку на объект?

Как создать ссылку на объект?
Имеется программа WPF. Есть 2 файла MainWindow.cs в нем создаются экземпляры классов и...

Как создать ссылку на объект внутри члена класса этого объекта
Подскажите пожалуйста, как мне создать ссылку на объект внутри члена класса этого объекта. В с++,...

Не могу создать ссылку она исчезает
Захожу в материал хочу на текст например “День трудного дня” вписать готовую ссылку на...

17
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
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(){}
Аналогично
1
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
29.07.2013, 09:53 3
И совет на будущее поля класса начале, а потом методы, очень трудно, вначале ищешь поля, потом назад, что бы воткнуть в методы.
1
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
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;
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
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трока, то Вам нужно создать массив строк, а цикл не нужен
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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 написан верно.
У тебя же нету даже нормальных конструктора копирования и оператора присвоения в нём!
0
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. а конструктору передается соответственно количество столбцов. ну это в идеале, а в суровой реальности просто ничего не работает )
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
30.07.2013, 12:52 8
Цитата Сообщение от SkaN2412 Посмотреть сообщение
C++
1
matrix[i] = new Row(w);
Цитата Сообщение от SkaN2412 Посмотреть сообщение
чего?) matrix - массив типа Row, в конструкторе указывается, сколько строк в матрице, а потом в цикле каждой ячейке matrix присваивается ссылка на объект этого класса Row. а конструктору передается соответственно количество столбцов. ну это в идеале, а в суровой реальности просто ничего не работает )
а нью разве не указатель возвращает? matrix[i] возвращает ссылку, а new Row(w) указатель, вот и не соответствие
0
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
30.07.2013, 13:17 9
Цитата Сообщение от Wolkodav Посмотреть сообщение
И совет на будущее поля класса начале, а потом методы, очень трудно, вначале ищешь поля, потом назад, что бы воткнуть в методы.
Моментально развидьте этот совет все, кто его видел. Классы, как и любой код, гораздо чаще читаются пользователями (кода, а не винды/компьютер/монитора), чем пишутся разработчиками. А пользователю нужен интерфейс класса, а не его внутреннее устройство.
0
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
30.07.2013, 13:32 10
Fyret, чего? Вот лично я сейчас читал код, читать очень сложно, в начале вниз, потом вверх... А уж если на то пошло, то надо делить класс на .h and .cpp. А не кидать всё в одну кучу
0
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
30.07.2013, 13:38 11
Есть множество подходов к организации кода, это вопрос вкуса (к слову: пихание всего в хедер уменьшает число единиц трансляции и, как следствие, время компиляции. Минусов тоже хватает).

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

Добавлено через 3 часа 23 минуты
Решение:
matrix[i] = *(new Row(w));
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
30.07.2013, 23:21 18
Цитата Сообщение от SkaN2412 Посмотреть сообщение
matrix[i] = *(new Row(w));
1)утечка
2) создание одного ряда размером w

Добавлено через 5 минут
Решение:
1) Навести порядок в классе Row - определить конструктор копирования и оператор = по-нормальному, чтоб утечек не было!
Ибо http://ru.wikipedia.org/wiki/%... 0%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[] для неинициализированного указателя будет плачевна.
0
30.07.2013, 23:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2013, 23:21
Помогаю со студенческими работами здесь

Не могу создать объект
Доброго времени суток, не могу понять где моя ошибка и в книге все работало, а у меня нет. Есть...

Зачем при перегрузке оператора >> в параметр включать ссылку на объект, а не сам объект?
Зачем в параметры функции включать ссылку на объект: istream &amp;operator&gt;&gt;(istream &amp;stream, myclass...

Не могу создать ссылку на переменную String с конструктора JFrame
Нужно создать ссылку в другом классе на переменную , которая находиться в &quot;public void...

Как преобразовать ссылку на объект в указатель на этот объект?
Как преобразовать ссылку на объект в указатель на этот объект? Буду благодарен за помощь.


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru