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

Найти ошибку в приведенном коде - C++

Восстановить пароль Регистрация
 
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
20.01.2014, 13:21     Найти ошибку в приведенном коде #1
На самом деле тут две ошибки. Первое, ругается windows при запуске (есть комментарий на какую строку). Второе - не понимаю как сделать умножение ( комментарием помечено).

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
#include <iostream>
using namespace std;
#include <process.h>           
       
////////////////////////////////////////////////////////////////
class D_Array
   {
   private:
      int *p;
      int size;
   public:
       D_Array(int s)
       {
           size = s;
           p = new int [size];
       }
      int& operator [](int n)  
         {
         if( n< 0 || n>=size )
            { cout << "\nIndex out of bounds"; exit(1); }
         return p[n];
         }
 
       int& operator *(int n)
       {
            for(int j=0; j<size; j++) 
                 p[j] = p[j]*n; 
            return *p;
       }
        int& operator /(int n)
       {
            for(int j=0; j<size; j++) 
                 p[j] = p[j]/n; 
            return *p;
       }
         int& operator =(D_Array  n)
       {
            for(int j=0; j<size; j++) 
                 p[j] = n[j]; 
            return *p;
       }
 
         int& operator =(char n[100])
       {
            for(int j=0; j<size; j++) 
                 p[j] = n[j]; 
            return *p;
       }
 
         ~D_Array()
         { delete [] p; }
   };
////////////////////////////////////////////////////////////////
int main()
   {
       int size = 100;
   D_Array sal(size);
    int staticsal[100];
   for(int j=0; j<size; j++)
      sal[j] = j;
 
   sal=staticsal[100];  // В чем ошибка ?
 
   int k = sal*1; // как сделать перегрузку для умножения 1*sal ?
   for(int j=0; j<size; j++)     
      {
      int temp = sal[j];    
      cout << "Element " << j << " is " << temp << endl;
      }
 
   return 0;
   }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Enotniy
 Аватар для Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
20.01.2014, 13:46     Найти ошибку в приведенном коде #2
Цитата Сообщение от Faoxis Посмотреть сообщение
sal=staticsal[100]; *// В чем ошибка ?
у вас не перегружен оператор = для int[]

Цитата Сообщение от Faoxis Посмотреть сообщение
int k = sal*1;
по-моему реализация бинарных операторов справа реализуется с помощью дружественных функций
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 13:48     Найти ошибку в приведенном коде #3
Цитата Сообщение от Faoxis Посмотреть сообщение
sal=staticsal[100]; // В чем ошибка ?
справа: выход за границы массива и тип int.
слева: попытка вызвать конструктор D_Array(int s), где в качестве s значение 100го элемента staticsal.

Для перегрузки бинарного оператора, когда первый аргумент является встроенным типом, нужно использовать функции, не являющиеся членом класса (возможно, дружеские).
Нечто такое:
C++
1
2
3
4
int operator* ( int a, const C& c )
{
    return a * c.value;
}
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
20.01.2014, 13:48     Найти ошибку в приведенном коде #4
Цитата Сообщение от Faoxis Посмотреть сообщение
// В чем ошибка ?
Вы пытаетесь присвоить объекту своего класса число.
Ну у плюс, там будет выход за диапазон, так как в массиве staticsal у вас 100 элементов а, элемент с индексом 100, это 101-й.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 13:49     Найти ошибку в приведенном коде #5
Цитата Сообщение от Enotniy Посмотреть сообщение
у вас не перегружен оператор = для int[]
Цитата Сообщение от Faoxis Посмотреть сообщение
int staticsal[100];
staticsal - это массив. О какой перегрузке речь?
Enotniy
 Аватар для Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
20.01.2014, 13:52     Найти ошибку в приведенном коде #6
Цитата Сообщение от Faoxis Посмотреть сообщение
sal=staticsal[100]; *// В чем ошибка ?
sal - это ваш объект
staticsal - это массив
напрямую одно другому присвоить нельзя
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 13:57     Найти ошибку в приведенном коде #7
Enotniy, конструктор (не являющийся explicit) же есть, который принимает int, он и будет вызван в данном случае.
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
20.01.2014, 14:01  [ТС]     Найти ошибку в приведенном коде #8
Как-то не очень я исправил...

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
#include <iostream>
using namespace std;
#include <process.h>           
       
////////////////////////////////////////////////////////////////
class D_Array
   {
   private:
      int *p;
      int size;
   public:
       D_Array(int s)
       {
           size = s;
           p = new int [size];
       }
      int& operator [](int n)  
         {
         if( n< 0 || n>=size )
            { cout << "\nIndex out of bounds"; exit(1); }
         return p[n];
         }
 
       int& operator *(int n)
       {
            for(int j=0; j<size; j++) 
                 p[j] = p[j]*n; 
            return *p;
       }
 
        int& operator /(int n)
       {
            for(int j=0; j<size; j++) 
                 p[j] = p[j]/n; 
            return *p;
       }
         int& operator =(D_Array  n)
       {
            for(int j=0; j<size; j++) 
                 p[j] = n[j]; 
            return *p;
       }
 
         int& operator =(int n[98])
       {
            for(int j=0; j<size; j++) 
                 p[j] = n[j]; 
            return *p;
       }
 
        friend int operator* ( int a, const C& c );
 
         ~D_Array()
         { delete [] p; }
 
   };
 
int operator* ( int a, const C& c )
{
    for(int j=0; j<size; j++) 
                 p[j] = c[j]*a; 
            return *p;
}
 
////////////////////////////////////////////////////////////////
int main()
   {
       int size = 100;
   D_Array sal(size);
    int staticsal[99];
   for(int j=0; j<size; j++)
      staticsal[j] = j;
 
   sal = staticsal[99];
 
   int k = sal*1; 
   for(int j=0; j<size; j++)     
      {
      int temp = sal[j];    
      cout << "Element " << j << " is " << temp << endl;
      }
 
   return 0;
   }
Объясните, пожалуйста, как правильно сделать дружественную функцию и что делать с массивом. Я понимаю, что он выходит за предел, но я поставил значение 99 и учел ошибку, что это int, а не char, а значит нет перегрузки функции. Но все равно не понимаю почему не работает...
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 14:04     Найти ошибку в приведенном коде #9
Цитата Сообщение от Faoxis Посмотреть сообщение
sal = staticsal[99];
Что Вы хотите этим добиться?
Выход за границы всё равно остался. Можно обращаться к элементам с индексами [0..N), где N - размер массива. Всё остальное - выход за границы.
Enotniy
 Аватар для Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
20.01.2014, 14:05     Найти ошибку в приведенном коде #10
Tulosba, Ну так он принимает int, не int[100];
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
20.01.2014, 14:06     Найти ошибку в приведенном коде #11
Цитата Сообщение от Faoxis Посмотреть сообщение
как правильно сделать дружественную функцию
В классе пишешь
C++
1
friend operator* ( int a, const C& c );

а за пределами класса реализацию функции.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 14:07     Найти ошибку в приведенном коде #12
Enotniy, а Вы думаете в этой строчке:
Цитата Сообщение от Faoxis Посмотреть сообщение
sal=staticsal[100];
передается int[100], а не int ?
Enotniy
 Аватар для Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
20.01.2014, 14:07     Найти ошибку в приведенном коде #13
Цитата Сообщение от Faoxis Посмотреть сообщение
Объясните, пожалуйста, как правильно сделать дружественную функцию и что делать с массивом.
http://habrahabr.ru/post/132014/
вот подробно о перегрузке операторов
Faoxis
6 / 6 / 0
Регистрация: 11.04.2012
Сообщений: 114
20.01.2014, 14:16  [ТС]     Найти ошибку в приведенном коде #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
        friend int operator*( int a, const D_Array& c );
         ~D_Array()
         { delete [] p; }
 
   };
 
int operator* ( int a, const D_Array& c )
{
    for(int j=0; j<100; j++) 
                 c[j] = c[j]*a; 
            return *c;
}
Не понимаю )
Enotniy
 Аватар для Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
20.01.2014, 14:42     Найти ошибку в приведенном коде #15
Цитата Сообщение от Faoxis Посмотреть сообщение
Не понимаю )
Зачем так - это "заплатка" в с++, потому делать надо именно так.
Дружественная функция не является членом класса, но может иметь доступ к его частным членам в случае, если объявлена вне класса
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2014, 14:42     Найти ошибку в приведенном коде
Еще ссылки по теме:

Найти ошибку в приведенном коде C++
Найти и исправить ошибки в приведенном коде C++
Найти ошибку в приведенном коде C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.01.2014, 14:42     Найти ошибку в приведенном коде #16
C++
1
2
3
4
5
6
7
D_Array operator* ( int a, const D_Array& c )
{
   D_Array ret = c;
   for(int j=0; j<c.size; j++) 
      ret[j] *= a; 
   return ret;
}
Цитата Сообщение от Faoxis Посмотреть сообщение
Не понимаю )
У Вас слишком много всего намешано. Имеет смысл разобраться со всем по-порядку, а не скопом.
Yandex
Объявления
20.01.2014, 14:42     Найти ошибку в приведенном коде
Ответ Создать тему
Опции темы

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