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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
azaron
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 14
#1

Subscript requires array or pointer type - C++

17.04.2011, 02:51. Просмотров 2396. Ответов 1
Метки нет (Все метки)

Задание
Нужно перегрузить операции для квадратной матрици
Операции: - =, * =.
но у меня не виходит ето зделать, подскажите, пожалуйста, в чем ошибка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//Matrix.h
#include <iostream>
#include <stdlib.h>
using namespace std;
class Matrix
{
        friend istream& operator >>(istream& , const Matrix&Arr);
        friend ostream& operator <<(std::ostream&, const Matrix&Arr); 
        int*ptr;
        int size;
public:
        Matrix(int s=10);
       Matrix(Matrix &arr);
        virtual~Matrix();
 
        void Rindomize(int num = 10);
        Matrix &operator-(Matrix &arr);
        Matrix &operator=(Matrix &arr);
        Matrix &operator-=(Matrix &arr);
        Matrix &operator*=(Matrix &arr);
        
};
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
128
129
130
131
132
133
134
135
136
137
//Matrix.cpp
#include "Matrix.h"
 
Matrix::Matrix(int s)
{
        size=s;
        int **ptr = new int *[size];  
        for (int i = 1; i <= size; i++ )
            {
                  if ((ptr[ i ] = new int [size]) == NULL) 
                  cout << "Error\n";
            }
 
         for(int i = 0; i < size; i++)
            for(int j=0; j<size; j++)
        {
                ptr[i][j] = 0;
        }
        cout << "Constructor" << endl;
}
//--------------------------------------------------------------------------------
Matrix::Matrix(Matrix& arr)
{ 
        size = arr.size;
        int **ptr = new int *[size];  
        for (int i = 1; i <= size; i++ )
            {
                  if ((ptr[ i ] = new int [size]) == NULL) 
                  cout << "Error\n";
        }
                 for(int i = 0; i < size; i++)
            for (int j=0; j<size; j++)
        {
                ptr[i][j] = arr.ptr[i][j];
                
        }
        
        cout << "Copy Constructor" << endl;
}
//--------------------------------------------------------------------------------
Matrix::~Matrix()
{
        delete[] ptr;
        cout << "Destructor" << endl;
}
//--------------------------------------------------------------------------------
void Matrix::Rindomize(int num)
{       
        for(int i = 0; i < size; i++)
            for(int j=0; j<size; j++)
        {
                ptr[i][j] = rand() % num;
        }       
}
//--------------------------------------------------------------------------------
ostream& operator <<(ostream& output, const Matrix& Arr)
{
    for(int i=0; i<Arr.size; ++i)
        for(int j=0; j<Arr.size; j++)
        output<<Arr.ptr[i][j]<<" ";
    return output; 
}
//--------------------------------------------------------------------------------
istream& operator >>(istream& input, const Matrix& Arr)
{
    for (int i=0; i<Arr.size; i++)
        input>>Arr.ptr[i];
    return input;
}
//--------------------------------------------------------------------------------
Matrix& Matrix::operator-=(Matrix& arr) 
{
        int mins = (size < arr.size) ? size : arr.size;         
       Matrix temp;
        if(mins == arr.size)
        {
                temp = *this;
                for(int i = 0; i < mins; i++)
                    for (int j=0; j<mins; j++)
                {               
                        temp.ptr[i][j] -= arr.ptr[i][j];
                }
        }
        else
        {       
                temp = arr;
                for(int i = 0; i < mins; i++)
                    for(int j=0; j<mins; j++)
                {               
                        temp.ptr[i][j] -= ptr[i][j];
                }               
        }
        cout << "Operator -=" << endl;
        return temp;
}
 
//--------------------------------------------------------------------------------
Matrix&Matrix::operator= (Matrix & arr)
{
        if(this != &arr)
        {
                delete[] ptr;
                size = arr.size;
                ptr = new int[size];
                for(int i = 0; i < size; i++)
                {
                        ptr[i] = arr.ptr[i];
                }
        }
        cout << "Operator =" << endl;
        return *this;
}
 
//--------------------------------------------------------------------------------
Matrix&Matrix::operator*=(Matrix &arr)
{
    int **tmp = new int *[size];  
        for (int i = 1; i <= size; i++ )
            {
                  if ((tmp[ i ] = new int [size]) == NULL) 
                  cout << "Error\n";
            }
         temp = *this;
                for(int i = 0; i < size; i++)
                    for (int j=0; j<size; j++)
                {               
                    tmp[i][j]=0;
                }
                    for(int i = 0; i < size; i++)
                    for (int j=0; j<size; j++)
                    for(int k=0; k<size; k++)
                      tmp[i][j]+= temp.ptr[i][k] * arr.ptr[k][j];
 
 
                cout<<"Operator *="<<endl;
                return tmp;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//main.cpp
#include "Matrix.h"
#include <conio.h>
#include <time.h>
 
int main()
{
        srand(time(0));
        Matrix a(5);
        a.Rindomize(5);
        Matrix b(7);
        b.Rindomize(5);
        Matrix c;  
        
        cout<<"HugeInt a:\n"<<a<<"\n";
        cout<<"HugeInt b:\n"<<b<<"\n";
 
        c=b;
        a*=b;
        b-=a;
        getch();
        
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2011, 02:51     Subscript requires array or pointer type
Посмотрите здесь:

C++ Ошибка: subscripted value is neither array nor pointer
invalid types ‘Room [26][26][26][double]’ for array subscript. Помогите разобраться пожалуйста. C++
Error C2109: subscript requires array or pointer type C++
C++ Работа с массивом - Invalid types 'int[int]' for array subscript
C++ Работа с функциями и ошибка "Subscript requires array or pointer type"
C++ Передача двумерного массива в функцию. Ошибка "invalid types for array subscript"
C++ Ошибка error: invalid types 'int[int]' for array subscript
Error C2109: subscript requires array or pointer C++
C++ Error: invalid types 'double [10][10][double]' for array subscript
Ошибка: expression must have pointer-to-object type C++
C++ Invalid types 'float[int]' for array subscript
Invalid types `float[int]' for array subscript C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.04.2011, 10:07     Subscript requires array or pointer type #2
Строка 95, 137 - возвращаешь ссылку на уничтоженный объект.

И вообще, если выкладываешь не компилируемый код, приводи и сообщения об ошибках. Собирать проект, чтобы увидеть некомпилируемость кода как-то не заводит вообще.

Добавлено через 41 секунду
В операторы лучше константную ссылку передавай.

Добавлено через 1 минуту
И вообще, ты не создаёшь матрицу никакую. Указатель из строки 10 не используется.
Yandex
Объявления
17.04.2011, 10:07     Subscript requires array or pointer type
Ответ Создать тему
Опции темы

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