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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
SkaN2412
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 4
#1

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2013, 04:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу создать ссылку на объект в массиве (C++):

Создать объект стек и создать объект очередь с перегруженными операциями - C++
Помогите, пожалуйста с заданиями. 1. Унарная операция Создать объект стек, перегрузив ++ и -- (как постфиксными, так и префиксными)....

Как вернуть ссылку на объект? - C++
Вот код из книжки А.Крупника &quot;Изучаем С++&quot; char suits = {'','—','','’'}; char cds = {'6','7','8','9','A','‚','„','Š','’'}; ...

Как передать ссылку на объект в класс - C++
Здравствуйте! Подскажите, пожалуйста, почему не работает: log.h class LogClass { public: bool InitializeLog(); void...

Присвоить ссылку на функцию, по ссылке на объект:) - C++
Добрый вечер! Имеются классы: class A {virtual double f1() = 0; virtual double f2()=0;} class B : A class C : A Создаю...

Как функции возвратить ссылку на объект? - C++
//Есть некая функция что писать перед функцией??? Инт написал. int func(){ // Создаем какой-то обьект Obj object_1; //что-то с ней...

Почему перегруженный оператор = должен возвращать ссылку на объект - C++
Объясните доступно пожалуйста. Почему перегруженный оператор= должен возвращать ссылку на объект? А оператор+ может возвращать как...

17
nonedark2008
925 / 664 / 141
Регистрация: 28.07.2012
Сообщений: 1,807
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
Wolkodav
604 / 457 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
29.07.2013, 09:53 #3
И совет на будущее поля класса начале, а потом методы, очень трудно, вначале ищешь поля, потом назад, что бы воткнуть в методы.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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;
1
aLarman
642 / 563 / 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трока, то Вам нужно создать массив строк, а цикл не нужен
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 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
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. а конструктору передается соответственно количество столбцов. ну это в идеале, а в суровой реальности просто ничего не работает )
0
aLarman
642 / 563 / 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) указатель, вот и не соответствие
0
Fyret
185 / 171 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 13:17 #9
Цитата Сообщение от Wolkodav Посмотреть сообщение
И совет на будущее поля класса начале, а потом методы, очень трудно, вначале ищешь поля, потом назад, что бы воткнуть в методы.
Моментально развидьте этот совет все, кто его видел. Классы, как и любой код, гораздо чаще читаются пользователями (кода, а не винды/компьютер/монитора), чем пишутся разработчиками. А пользователю нужен интерфейс класса, а не его внутреннее устройство.
0
Wolkodav
604 / 457 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
30.07.2013, 13:32 #10
Fyret, чего? Вот лично я сейчас читал код, читать очень сложно, в начале вниз, потом вверх... А уж если на то пошло, то надо делить класс на .h and .cpp. А не кидать всё в одну кучу
0
Fyret
185 / 171 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 13:38 #11
Есть множество подходов к организации кода, это вопрос вкуса (к слову: пихание всего в хедер уменьшает число единиц трансляции и, как следствие, время компиляции. Минусов тоже хватает).

Но главное правило - код должен легко читаться пользователем. Пользователю внутренние данные не нужны.
0
Wolkodav
604 / 457 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
30.07.2013, 13:53 #12
А на кой пользователю лазать в код? В код лазают, те кто его пишут...
0
Fyret
185 / 171 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 14:00 #13
Цитата Сообщение от Wolkodav Посмотреть сообщение
А на кой пользователю лазать в код? В код лазают, те кто его пишут...
Читайте сообщения внимательнее, пожалуйста.
0
Wolkodav
604 / 457 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
30.07.2013, 14:03 #14
Fyret, понял... Туплю... Но писать код для себя, когда один чирикаешь, это одно, а когда пишешь в команде, надо и о других позаботиться. Да еще возможность прихода новых, и очень трудно, еще повторюсь, бегать по коду, искать в начале поля класса, а потом возвращаться к методам.
0
Fyret
185 / 171 / 13
Регистрация: 30.07.2013
Сообщений: 359
30.07.2013, 14:12 #15
Цитата Сообщение от Wolkodav Посмотреть сообщение
Но писать код для себя, когда один чирикаешь, это одно, а когда пишешь в команде, надо и о других позаботиться.
Wolkodav, именно, я об и говорю. Но класс, к примеру, поддерживает команда из 3-4 человек - им надо бегать от методов к данным и обратно. А пользуются классом 20, 30, 50 человек из других отделов, и им бегать не надо. Ну и кого больше? Чье удобство приоритетнее?
0
30.07.2013, 14:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2013, 14:12
Привет! Вот еще темы с ответами:

Конструктор, принимающий в качестве аргумента ссылку на объект, всё портит - C++
Друзья! Вот корректный код: class foo { public: foo() { } ...

Не могу добавить ссылку на dll - C++
добрый день. пытаюсь подключить dll. у меня не активное диалоговое окно common properties. почему не пойму..

Не могу найти ошибку с подсчетом суммы элементов в интервале[a,b] в динамическом одномерном массиве массиве. - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include &lt;iomanip&gt; #include &lt;stdio.h&gt; #include...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru