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

Перегрузка функций - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.60
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 17:37     Перегрузка функций #1
Здравствуйте ! Попробовал выполнить задание, но есть проблемы...Кто может проверит а ошибки...
Задание:
АДТ - одномерный массив (вектор) вещественных чисел. Дополнительно перегрузить след. операции:
"+" - сложение векторов (a[i]+b[i] для всех i);
"[]" - доступ по индексу;
"+" - добавить число к вектору (double+vector)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Задание вроде как выполнил, но проблема в том, что не знаю как проверить работоспособность, нужен небольшой тест.
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
#include <iostream> 
using namespace std; 
 
class matrix {   // класс
private: 
  float m[3]; // одномерный массив
 
public: 
  matrix();                  
  matrix(float initial);      
  matrix(const matrix& mat); 
  ~matrix() {}                 
 
  // перегрузка операций  
    // доступ по индексу  
  float   operator [] (const int index_x); 
    // вычитание числа  
  matrix  operator + (const float value); 
    // вычитание матрицы 
  matrix  operator + (const matrix& mat);    
}; 
 
matrix::matrix() { 
  // создаем матрицу 
  for(int i=0; i<3; i++) 
         m[i]=0.f;  
  m[0]=m[1]=m[2]=1.f; 
} 
 
matrix::matrix(float initial) { 
  for(int i=0; i<3; i++) 
         m[i]=0.f; 
  m[0]=m[1]=m[2]=initial; 
} 
 
matrix::matrix(const matrix& mat) { 
  // копируем матрицу 
  for(int i=0; i<3; i++) 
         m[i]=mat.m[i]; 
} 
 //доступ по индексу
float matrix::operator [](const int index_x) { 
  return m[index_x]; 
}  
 
matrix matrix::operator + (const matrix& mat) { 
  matrix tmp; 
  for(int i=0; i<3; i++) 
       tmp.m[i]=m[i]+mat.m[i]; 
  return tmp; 
} 
 
matrix matrix::operator + (const float value) { 
  matrix tmp; 
  for(int i=0; i<3; i++) 
        tmp.m[i]=m[i]+value; 
  return tmp; 
} 
 
// вспомогательная функция для вывода матрицы   
void printMatrix(matrix& mat) { 
 cout << mat[0] << " " << mat[1] << " " << mat[2] << endl; 
  //cout << "------------------------" << endl; 
} 
 
int main() { 
[B]  // небольшой тест написанного [/B] 
  
  return 0; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2010, 17:37     Перегрузка функций
Посмотрите здесь:

C++ Перегрузка функций в C++
C++ Перегрузка функций
Перегрузка функций C++
C++ Перегрузка функций
Перегрузка функций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
14.03.2010, 17:50     Перегрузка функций #2
) одномерный вектор называется "матрица" ))
вот:
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
class vect{
private:
 int size;//размер вектора
 int *data; //массив
public:
 explicit vect(int i)
 {
     data=new int[i];
 }
 ~vect()
 {
     delete [] data;
 }
 vect &operrator+(const vector &V)//ссылку возвращаем!!
 {
    if (size!=V.size) return *this; //вообщето, если вектора не совпадают по размеру это ошибка, и должно заканчиваться печально.
    for (int i=0;i <size;i++)
    {
        data[i]+=V.data[i];
    } 
    return *this;
 }
  int &operator[](int index) //тута надо ссылку возвращать! а не сам элемент!!!!
  {
     return data[index];
  } 
};
вот как то так это и должно выглядеть. А по какому правилу надо умножать вектра а? В линейной алгебре только скалярное произведени можно делать между векторами, оно и нужно?
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 18:04  [ТС]     Перегрузка функций #3
Не умножать, а сложить надо. И здесь разве есть перегрузка ф-ии ? Что - то я немного не разобрался
6,14,15 - строки с ошибками !
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
14.03.2010, 18:58     Перегрузка функций #4
ошибки, конечно! я не проверял что написал. испарвь их сам, мне лень. и перегрузка нужна не функции а опереторов. ну вот они и перегружены у меня... у тебя же они тоже прегружены (правда не очень хорошо, но это мелоч), значит ты должен понимать, что происходит. насче умножения - ивени показалось.
Сукть переопределения(перегрузки) опереторов:
компилятор знает как применитя опрации *,&,||,<< и т.д. к int,double ... но не знает что ему делать есть программист хочет использовать эти операции (операторы) в контексте собственных классов(типов данных). И что бы указать что же должно происходить при примениении оператора надо это дело описать.
вот наример прибавление числа к вектору: (наверно имеется ввиду к каждуому его элементу)
C++
1
2
3
4
5
6
7
8
vect &operator+(int num)
{
     for (int i=0;i<size;i++)
     {
         data[i]+=num;
      }
     return *this;
}
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:02  [ТС]     Перегрузка функций #5
Спасибо !

Ошибки в 9, 17 и 18 строках.
9 - vect::operrator: требуется инициализация в списке инициализации базовых классов и членов
17 - синтаксическая ошибка: отсутствие ";" перед "+"
18 - непредвиденные лексемы перед '{'; пропуск вероятного тела функции
Бред какой - то !

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
#include <iostream>
using namespace std;
 
class vect{
private:
 int size;//размер вектора
 int *data; //массив
public:
 explicit vect(int i)
 {
     data=new int[i];
 }
 ~vect()
 {
     delete [] data;
 }
 vect &operrator+ (const vector &V)//ссылку возвращаем!!
 {
    if (size!=V.size) return *this; //вообщето, если вектора не совпадают по размеру это ошибка, и должно заканчиваться печально.
    for (int i=0;i <size;i++)
    {
        data[i]+=V.data[i];
    } 
    return *this;
 }
  int &operator[](int index) //тута надо ссылку возвращать! а не сам элемент!!!!
  {
     return data[index];
  } 
  vect &operator+(int num)
{
     for (int i=0;i<size;i++)
     {
         data[i]+=num;
      }
     return *this;
}
};
И как быть с тестом работы программы ?
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 67
14.03.2010, 20:08     Перегрузка функций #6
operator пишется с одной "r"

upd: я про строку 17
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:22  [ТС]     Перегрузка функций #7
Исправил ! Появилось сразу 7 ошибок
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 67
14.03.2010, 20:23     Перегрузка функций #8
ну, напиши какие, посмотрим)
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:34  [ТС]     Перегрузка функций #9
Ошибка 1 синтаксическая ошибка: отсутствие "," перед "&"

Ошибка 2 vect &vect::operator +(int): функция-член уже определена или объявлена

Ошибка 3 V: необъявленный идентификатор

Ошибка 4 выражение слева от ".size" должно представлять класс, структуру или бъединение

Ошибка 5 V: необъявленный идентификатор

Ошибка 6 выражение слева от ".data" должно представлять класс, структуру или объединение

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
#include <iostream>
using namespace std;
 
class vect{
private:
 int size;//размер вектора
 int *data; //массив
public:
 explicit vect(int i)
 {
     data=new int[i];
 }
 ~vect()
 {
     delete [] data;
 }
 vect& operator + (int vector &V)//ссылку возвращаем!!
 {
    if (size!=V.size) return *this; //вообщето, если вектора не совпадают по размеру это ошибка, и должно заканчиваться печально.
    for (int i=0;i <size;i++)
    {
        data[i]+=V.data[i];
    } 
    return *this;
 }
  int &operator[](int index) //тута надо ссылку возвращать! а не сам элемент!!!!
  {
     return data[index];
  } 
  vect& operator + (int num)
{
     for (int i=0;i<size;i++)
     {
         data[i]+=num;
      }
     return *this;
}
};
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 67
14.03.2010, 20:36     Перегрузка функций #10
отредактируй, вставь номер строк пожалуйста

upd: в строке 17 "int vector &V" замени на "vect &V"
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:46  [ТС]     Перегрузка функций #11
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup MSVCRTD.lib

Ошибка 2 fatal error LNK1120: 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
#include <iostream>
using namespace std;
 
class vect{
private:
 int size;//размер вектора
 int *data; //массив
public:
 explicit vect(int i)
 {
     data=new int[i];
 }
 ~vect()
 {
     delete [] data;
 }
 vect& operator + (int vector &V)//ссылку возвращаем!!
 {
    if (size!=V.size) return *this; //вообщето, если вектора не совпадают по размеру это ошибка, и должно заканчиваться печально.
    for (int i=0;i <size;i++)
    {
        data[i]+=V.data[i];
    } 
    return *this;
 }
  int &operator[](int index) //тута надо ссылку возвращать! а не сам элемент!!!!
  {
     return data[index];
  } 
  vect& operator + (int num)
{
     for (int i=0;i<size;i++)
     {
         data[i]+=num;
      }
     return *this;
}
};
После исправления ошибки в строке 17
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 67
14.03.2010, 20:48     Перегрузка функций #12
см. мой предыдущий пост)
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:50  [ТС]     Перегрузка функций #13
Не давало редактировать мой прошлый пост, пришлось новую создавать )) Осталось две !
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 67
14.03.2010, 20:52     Перегрузка функций #14
и какие же?)

upd: а, вижу.)

upd2: у тебя нету функции main тебе тут только класс написали)
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 21:00  [ТС]     Перегрузка функций #15
Вот мне и надо небольшой тест написанного класса

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
#include <iostream>
using namespace std;
 
class vect{
private:
 int size;//размер вектора
 int *data; //массив
public:
 explicit vect(int i)
 {
     data=new int[i];
 }
 ~vect()
 {
     delete [] data;
 }
 vect& operator + (vect &V)//ссылку возвращаем!!
 {
    if (size!=V.size) return *this; //вообщето, если вектора не совпадают по размеру это ошибка, и должно заканчиваться печально.
    for (int i=0;i <size;i++)
    {
        data[i]+=V.data[i];
    } 
    return *this;
 }
  int &operator[](int index) //тута надо ссылку возвращать! а не сам элемент!!!!
  {
     return data[index];
  } 
  vect& operator + (int num)
{
     for (int i=0;i<size;i++)
     {
         data[i]+=num;
      }
     return *this;
}
  int main() { 
 
// небольшой тест написанного класса
 
  return 0; 
} 
}
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 67
14.03.2010, 21:11     Перегрузка функций #16
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
#include <iostream>
using namespace std;
 
class vect{
private:
 int size;//размер вектора
 int *data; //массив
public:
 explicit vect(int i)
 {
     data=new int[i];
 }
 ~vect()
 {
     delete [] data;
 }
 vect& operator + (int vector &V)//ссылку возвращаем!!
 {
    if (size!=V.size) return *this; //вообщето, если вектора не совпадают по размеру это ошибка, и должно заканчиваться печально.
    for (int i=0;i <size;i++)
    {
        data[i]+=V.data[i];
    } 
    return *this;
 }
  int &operator[](int index) //тута надо ссылку возвращать! а не сам элемент!!!!
  {
     return data[index];
  } 
  vect& operator + (int num)
{
     for (int i=0;i<size;i++)
     {
         data[i]+=num;
      }
     return *this;
}
int show()
{
for(int i = 0; i< size; i++)
cout<<data[i]<<' ';
cout<<'\n';
return 0;
}
};
int main()
{
vect v1(2);
v1[0] = 4;
v1[1] = 3;
vect v2(2);
v2 = 1;
v2 = 2;
v1 = v1 + v2;
 
v1.show();
 
getch();
return 0;
}
что-то вроде этого)
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 21:33  [ТС]     Перегрузка функций #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
#include <iostream>
using namespace std;
 
class vect{
private:
 int size;//размер вектора
 int *data; //массив
public:
 explicit vect(int i)
 {
     data=new int[i];
 }
 ~vect()
 {
     delete [] data;
 }
 vect& operator + (vect &V)//ссылку возвращаем!!
 {
    if (size!=V.size) return *this; //вообщето, если вектора не совпадают по размеру это ошибка, и должно заканчиваться печально.
    for (int i=0;i <size;i++)
    {
        data[i]+=V.data[i];
    } 
    return *this;
 }
  int &operator[](int index) //тута надо ссылку возвращать! а не сам элемент!!!!
  {
     return data[index];
  } 
  vect& operator + (int num)
{
     for (int i=0;i<size;i++)
     {
         data[i]+=num;
      }
     return *this;
}
int show()
{
for(int i = 0; i< size; i++)
cout<<data[i]<<' ';
cout<<'\n';
return 0;
}
};
 
int main()
{
vect v1(2);
v1[0] = 4;
v1[1] = 3;
vect v2(2);
v2 = 1;
v2 = 2;
v1 = v1 + v2;
 
v1.show();
 
getch();
return 0;
}
Ошибка 1 error C2679: бинарный '=': не найден оператор, принимающий правый операнд типа 'int' (или приемлемое преобразование отсутствует) 53

Ошибка 2 error C2679: бинарный '=': не найден оператор, принимающий правый операнд типа 'int' (или приемлемое преобразование отсутствует) 54

Ошибка 3 error C3861: getch: идентификатор не найден 59


А так большое СПАСИБО !
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 67
14.03.2010, 21:42     Перегрузка функций #18
ой, сорь
v2 = 1;
v2 = 2;

тут надо индексы поставить) [0] и [1] как у v1
и подключи библиотеку для getch()
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 21:58  [ТС]     Перегрузка функций #19
Всё исправил ! Всё запускается ! Всё СУПЕР ! НО ! )) Тест работы программы не пашет, наверно, тупо консольное чёрное окно и всё, нажимаю клавишу и на этом всё, выход
Библиотека conio.h ? Так ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2010, 22:05     Перегрузка функций
Еще ссылки по теме:

C++ Перегрузка функций
C++ Перегрузка функций
Перегрузка функций C++

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

Или воспользуйтесь поиском по форуму:
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 67
14.03.2010, 22:05     Перегрузка функций #20
замени это
C++
1
2
3
4
 explicit vect(int i)
 {
     data=new int[i];
 }
на это

C++
1
2
3
4
5
 explicit vect(int i)
 {
     size = i;
     data=new int[size];
 }

upd: да, конио)
Yandex
Объявления
14.03.2010, 22:05     Перегрузка функций
Ответ Создать тему
Опции темы

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