Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
1

Перегрузка операторов

21.11.2013, 22:37. Показов 1838. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток!Пожалуйста помогите мне неучу разобраться.Пытаюсь разобраться с классами,но пока безуспешно без посторонней помощи не обойтись.Вот готовый пример перегрузки операторов ,но программа вылетает
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
#include <stdlib.h>
#include <iostream>
#include <cstring> 
 
using namespace std;
 //СОЗДАЕМ СОБСТВЕННЫЙ КЛАСС
class stroka
{
  public:
   stroka (char*); //конструктор класса принимающий один параметр
   void operator +(char*); //определение оператора +
   void operator -(char); //определение оператора -
   void show_stroka(void); //метод класса для отображения строки
  private:
   char data[256]; //символьный массив, доступный только классу
};
stroka::stroka(char *str) //Транзитом через конструктор
{
strcpy(data,str); //копируем в символьный массив класса данные из принимаемой извне строки
}
void stroka::operator +(char *str) //Определяем оператор +
{
strcat(data,str); //как функцию сложения двух строк
}
void stroka::operator -(char letter)//Определяем оператор -
{
char temp[256]; // будем создавать новую строку
int i,j; //счетчики циклов
//Проходим по всей строке класса с помощью цикла и если символ строки не равен принятому символу (параметру), то копируем его в новую строку
for (i=0,j=0;data[i];i++) if (data[i]!=letter) temp[j++]=data[i];
temp[j]=NULL;
strcpy(data,temp); //Копируем новую строку в символьный массив класса
}
void stroka::show_stroka(void)
{
cout<<data<<endl; //Показываем символьный массив класса
}
int main()
{
 
  char *st,*st2; //Объявление двух указателей для строк
  cin.get(st,256); //Считывание первой строки с клавиатуры
  cin.get(st2,256); //Считывание второй строки с клавиатуры
  stroka title(st); //Объявление переменной типа нашего класса и передача в конструктор первой строки
  title+" "; //С помощью перегрузки операторов добавили к строке пробел
  title+st2; //C помощью перегрузки операторов добавили к строке вторую строку
  title.show_stroka(); //Отобразили результирующую строку на экране
  title-'в'; //При помощи перегрузки операторов пытаемся удалить символ в
  title.show_stroka(); //Отобразили результирующую строку
 
  return 0;
}
Пробовал и другие примеры куча ошибок.Пожалуйста подскажите как правильно делать.Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2013, 22:37
Ответы с готовыми решениями:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Перегрузка операторов
Расскажите пожалуйста про перегрузку в классе: всегда ли в ней должен быть return и что в нём...

Перегрузка операторов
Нужно перегрузить оператор сложения и вычитания, пытался но никак не получается. Подскажите как...

Перегрузка операторов /=, +=, -=
Добрый день. Есть 3 дроби F1, F2, F3 и нужно перегрузить оператор /=, у меня это выглядит так: ...

20
183 / 182 / 56
Регистрация: 10.06.2011
Сообщений: 871
21.11.2013, 22:40 2
Genn55, после или перед return напишите:
C++
1
system("pause");
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
21.11.2013, 22:44 3
не выделена память под st и st2
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
21.11.2013, 22:48  [ТС] 4
Цитата Сообщение от Ryuk Посмотреть сообщение
Genn55, после или перед return напишите:
C++
1
system("pause");
Не поможет точно из за этого программа аварийно завершаться не будет.

Добавлено через 2 минуты
Цитата Сообщение от retmas Посмотреть сообщение
не выделена память под st и st2
Можете подсказать как правильно сделать?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
21.11.2013, 22:52 5
в вашем случае достаточно будет
C++
1
2
char st[256];
char st2[256];
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
21.11.2013, 22:57  [ТС] 6
Цитата Сообщение от retmas Посмотреть сообщение
в вашем случае достаточно будет
C++
1
2
char st[256];
char st2[256];
Появились ошибки (конфликт) в моем случае *st,*st2 это указатели.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
21.11.2013, 22:59 7
ну выделяйте память тогда
C++
1
char* st = new char[256];
и не забудьте delete[] ее потом
то же для st2
0
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
21.11.2013, 23:05 8
Цитата Сообщение от Genn55 Посмотреть сообщение
Появились ошибки (конфликт) в моем случае *st,*st2 это указатели.
Указатели на что-то указывают Как ты их собираешься заполнить? Тогда создавай либо просто char, либо делай как написал человек выше))
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
21.11.2013, 23:16  [ТС] 9
А что изменится?Все тоже самое.*st,*st2 это же не переменные,а указатели.

Добавлено через 3 минуты
Цитата Сообщение от uhx Посмотреть сообщение
Указатели на что-то указывают Как ты их собираешься заполнить? Тогда создавай либо просто char, либо делай как написал человек выше))
\main.cpp||In function 'int main()':|
\main.cpp|45|error: redeclaration of 'char* st'|
\main.cpp|41|error: 'char* st' previously declared here|
\main.cpp|46|error: redeclaration of 'char* st2'|
\main.cpp|41|error: 'char* st2' previously declared here|
\main.cpp|50|warning: deprecated conversion from string constant to 'char*'|
||=== Build finished: 4 errors, 1 warnings ===|
Так и сделал.

Добавлено через 8 минут
Уменя кодеблок выдает
\main.cpp||In function 'int main()':|
\main.cpp|45|warning: deprecated conversion from string constant to 'char*'|
\main.cpp|42|warning: 'st' is used uninitialized in this function|
\main.cpp|43|warning: 'st2' is used uninitialized in this function|
||=== Build finished: 0 errors, 3 warnings ===|
А чем они инициализированы не пойму.
0
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
21.11.2013, 23:24 10
char *st = new char[256],*st2 = new char[256];
И у меня все запустилось.
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
22.11.2013, 00:50  [ТС] 11
Убрал указатеи и у меня получилось.

Добавлено через 1 час 15 минут
Вылетать перестала, но и работать не стала.Вместо сложения строк происходит просто копирование одной строки в другую.
0
Ryuk
22.11.2013, 07:56
  #12

Не по теме:

Genn55, каков вопрос, таков и ответ.

0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2013, 09:44 13
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
#include <stdlib.h>
#include <iostream>
#include <cstring> 
 
using namespace std;
//СОЗДАЕМ СОБСТВЕННЫЙ КЛАСС
class stroka
{
public:
    stroka (char*); //конструктор класса принимающий один параметр
    void operator+(char*); //определение оператора +
    void operator-(char); //определение оператора -
    void show_stroka(void); //метод класса для отображения строки
private:
    char data[256]; //символьный массив, доступный только классу
};
 
stroka::stroka(char *str) //Транзитом через конструктор
{
    strcpy(data, str); //копируем в символьный массив класса данные из принимаемой извне строки
}
 
void stroka::operator+(char *str) //Определяем оператор +
{
    strcat(data, str); //как функцию сложения двух строк
}
 
void stroka::operator-(char letter)//Определяем оператор -
{
    char temp[256]; // будем создавать новую строку
    int i, j; //счетчики циклов
    //Проходим по всей строке класса с помощью цикла и если символ строки не равен принятому символу (параметру), то копируем его в новую строку
    for (i = 0, j = 0; data[i]; ++i) if (data[i] != letter) temp[j++] = data[i];
    temp[j] = '\0';
    strcpy(data, temp); //Копируем новую строку в символьный массив класса
}
void stroka::show_stroka(void)
{
    cout << data << endl; //Показываем символьный массив класса
}
 
int main()
{
 
    char st[256], st2[256]; //Объявление двух указателей для строк
    cin.get(st, 256); //Считывание первой строки с клавиатуры
    cin.get();
    cin.get(st2, 256); //Считывание второй строки с клавиатуры
    stroka title(st); //Объявление переменной типа нашего класса и передача в конструктор первой строки
    title + " "; //С помощью перегрузки операторов добавили к строке пробел
    title + st2; //C помощью перегрузки операторов добавили к строке вторую строку
    title.show_stroka(); //Отобразили результирующую строку на экране
    title - 'b'; //При помощи перегрузки операторов пытаемся удалить символ в
    title.show_stroka(); //Отобразили результирующую строку
 
    return 0;
}
Миниатюры
Перегрузка операторов  
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
22.11.2013, 10:54  [ТС] 14
Все заработало.Вот так и учусь самостоятельно, сначала устраняю ошибки а потом разбираюсь с алгоритмом.Полная каша в голове.

Добавлено через 48 минут
alsav22, если можно подскажите
вместо
C++
1
temp[j] = '\0';
я пишу
C++
1
  temp[j] = NULL;
все работает в обоих случаях но в строке
C++
1
title + " "; //С помощью перегрузки операторов добавили к строке пробел
в обоих случаях предупреждение старое преобразование,а как правильно написать?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
22.11.2013, 11:19 15
Цитата Сообщение от Genn55 Посмотреть сообщение
в обоих случаях предупреждение старое преобразование,а как правильно написать?
Поменять в определении operator + тип параметра с char * на char const*.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2013, 11:32 16
NULL обычно используется при работе с указателями (для наглядности), поэтому, в данном случае (строка), для наглядности лучше использовать '\0'.
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
22.11.2013, 11:41  [ТС] 17
Цитата Сообщение от gray_fox Посмотреть сообщение
Поменять в определении operator + тип параметра с char * на char const*.
появляются ошибки
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
22.11.2013, 11:45 18
Цитата Сообщение от Genn55 Посмотреть сообщение
появляются ошибки
:/ http://ideone.com/z1ZNEm
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
22.11.2013, 11:58  [ТС] 19
char const* и const char* не одно и тоже?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
22.11.2013, 12:00 20
Цитата Сообщение от Genn55 Посмотреть сообщение
char const* и const char* не одно и тоже?
одно и то же
1
22.11.2013, 12:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2013, 12:00
Помогаю со студенческими работами здесь

Перегрузка операторов
Ругается на операторы != и &lt; в 208 - 209 строках. На сколько я понял нужно перегрузить их. Можете...

Перегрузка операторов С++
Здравствуйте, недавно начал изучать С++, до этого старался решать проблемы самостоятельно, но...

Перегрузка операторов
Здравствуйте. Есть класс, переменной членом которого является массив. Необходимо, перегрузить...

Перегрузка операторов
Создайте класс Fraction (обыкновенная дробь), в котором реализовать перегрузку: оператора...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru