Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89

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

14.03.2010, 17:37. Показов 3653. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте ! Попробовал выполнить задание, но есть проблемы...Кто может проверит а ошибки...
Задание:
АДТ - одномерный массив (вектор) вещественных чисел. Дополнительно перегрузить след. операции:
"+" - сложение векторов (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; 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.03.2010, 17:37
Ответы с готовыми решениями:

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

Перегрузка функций. Реализация функций
Разработать функцию f(x) , которая возвращает младшую цифру натурального числа x . Вычислить с ее помощью значение выражения z= f(a) +...

Перегрузка функций с++
Задача состоит в том, чтобы написать перегуженную функцию и то, что будет её вывзывать в перегуженной функкции надо реализовать сложение...

21
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
14.03.2010, 17:50
) одномерный вектор называется "матрица" ))
вот:
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];
  } 
};
вот как то так это и должно выглядеть. А по какому правилу надо умножать вектра а? В линейной алгебре только скалярное произведени можно делать между векторами, оно и нужно?
1
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 18:04  [ТС]
Не умножать, а сложить надо. И здесь разве есть перегрузка ф-ии ? Что - то я немного не разобрался
6,14,15 - строки с ошибками !
0
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
14.03.2010, 18:58
ошибки, конечно! я не проверял что написал. испарвь их сам, мне лень. и перегрузка нужна не функции а опереторов. ну вот они и перегружены у меня... у тебя же они тоже прегружены (правда не очень хорошо, но это мелоч), значит ты должен понимать, что происходит. насче умножения - ивени показалось.
Сукть переопределения(перегрузки) опереторов:
компилятор знает как применитя опрации *,&,||,<< и т.д. к 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;
}
1
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:02  [ТС]
Спасибо !

Ошибки в 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;
}
};
И как быть с тестом работы программы ?
0
22 / 21 / 0
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 20:08
operator пишется с одной "r"

upd: я про строку 17
0
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:22  [ТС]
Исправил ! Появилось сразу 7 ошибок
0
22 / 21 / 0
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 20:23
ну, напиши какие, посмотрим)
0
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:34  [ТС]
Ошибка 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;
}
};
0
22 / 21 / 0
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 20:36
отредактируй, вставь номер строк пожалуйста

upd: в строке 17 "int vector &V" замени на "vect &V"
1
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:46  [ТС]
Ошибка 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
0
22 / 21 / 0
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 20:48
см. мой предыдущий пост)
0
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 20:50  [ТС]
Не давало редактировать мой прошлый пост, пришлось новую создавать )) Осталось две !
0
22 / 21 / 0
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 20:52
и какие же?)

upd: а, вижу.)

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

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; 
} 
}
0
22 / 21 / 0
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 21:11
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;
}
что-то вроде этого)
1
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 21:33  [ТС]
Немного подправил...что - то типа того, но ....

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


А так большое СПАСИБО !
0
22 / 21 / 0
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 21:42
ой, сорь
v2 = 1;
v2 = 2;

тут надо индексы поставить) [0] и [1] как у v1
и подключи библиотеку для getch()
1
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 21:58  [ТС]
Всё исправил ! Всё запускается ! Всё СУПЕР ! НО ! )) Тест работы программы не пашет, наверно, тупо консольное чёрное окно и всё, нажимаю клавишу и на этом всё, выход
Библиотека conio.h ? Так ?
0
22 / 21 / 0
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 22:05
замени это
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: да, конио)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.03.2010, 22:05
Помогаю со студенческими работами здесь

Перегрузка функций
Доброго времени суток . Очень нужна ваша помощь . Нужно написать программу , которая обеспечивает перемножение 2 чисел , перемножение...

Перегрузка функций
Всем привет! Дано задание : написать программу для работы с двумерными массивами, которая будет содержать перегруженные функции для...

Перегрузка функций
Добрый день! Скажите, пожалуйста, как функция перегружается в классе? Мне нужно подробное объяснение (в каком месте программного кода,...

Перегрузка функций в C++
Создать класс Integer для работы с целыми числами. Определить перегруженную функцию, возвращающую sin аргумента. Функция не является членом...

Перегрузка функций
Стало интересно из-за возможна перегрузка функций в программе на языке С++, с чем это связано, как реализовано внутри программы? Кто...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru