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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.60
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
#1

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

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

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

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

Перегрузка функций - C++
Моя последняя лаба=( Светлые умы, помогите... Выполнить задания пятой и шестой лабораторной работы, оформив каждый пункт задания в виде...

Перегрузка функций - C++
АТД - множество с элементами типа int. Дополнительно перегрузить следующие операции: «+» - добавить элемент в множество(типа int +...

Перегрузка функций - C++
Здравствуйте уважаемые програмисты:) У меня вот такое задание: В классе необходимо перегрузить нижеследующие операции, при этом две...

Перегрузка функций - C++
Для одномерного массива из n вещественных элементов и од*номерного массива из n строк, найти соответственно: 1.1. Максимальный по модулю...

21
Aye Aye
369 / 283 / 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];
  } 
};
вот как то так это и должно выглядеть. А по какому правилу надо умножать вектра а? В линейной алгебре только скалярное произведени можно делать между векторами, оно и нужно?
1
Opiym
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
14.03.2010, 18:04  [ТС] #3
Не умножать, а сложить надо. И здесь разве есть перегрузка ф-ии ? Что - то я немного не разобрался
6,14,15 - строки с ошибками !
0
Aye Aye
369 / 283 / 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;
}
1
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;
}
};
И как быть с тестом работы программы ?
0
romych2004
22 / 21 / 3
Регистрация: 29.03.2009
Сообщений: 69
14.03.2010, 20:08 #6
operator пишется с одной "r"

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

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

upd: а, вижу.)

upd2: у тебя нету функции main тебе тут только класс написали)
0
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; 
} 
}
0
14.03.2010, 21:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2010, 21:00
Привет! Вот еще темы с ответами:

перегрузка функций - C++
У меня есть структура Студенты. в ней есть Имя студента, его Бал аттестата и Возраст. Подскажите, плиз, как создать функцию add(); и...

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

Перегрузка функций - C++
Задача такая: перегрузить * так чтобы время умножалось на число, и так чтобы число умножалось на время. Не могу понять как реализовать...

Перегрузка функций - C++
разработайте две версии функции F,заголовки которых выглядят следующим образом: 1) float F(float х); 2) void F (float x, float &amp;y); ...


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

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

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