Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
15 / 15 / 4
Регистрация: 11.11.2014
Сообщений: 122
1

Приведение типов в классе

26.05.2015, 22:44. Показов 1525. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день всем, кто увлекается.

Столкнулся с такой проблемой. Есть класс String (костыль собственного производства). Хочу перегрузить операцию сложения с прототипом:

C++ (Qt)
1
friend String operator+(const String &, const String &)
Вот кусок кода:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String::String(const char * s)
{
    len = strlen(s);
    str = new char[len+1];
    strcpy(str,s);
    num_strings++;
}
 
String::String()
{
    len = 0;
    str = new char[1];
    str[0] = '\0';
    num_strings++;:
}
 
String operator+(const String & st1, const String & st2) 
{   
    return String(std::strcat(st1.str, st2.str));
}
Хочу с таким определением сделать сложение:
C++ (Qt)
1
2
3
String a("Vasya");
String b;
b = "Katya " + a;
Сейчас программа вылетает с руганью на памяти. Можно ли грамотно перегрузить операцию сложения, чтобы она умела работать с таким определением. Как вариант написать явное приведение из char в структуру класса (пока ни одной мысли на эту тему). Или придётся перегружать операцию сложения в остальных двух случаях, когда одна из переменных const char *?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2015, 22:44
Ответы с готовыми решениями:

Приведение типов
Привет всем! Компилятор выдает варнинг если сравниваются signed и unsigned значения.Допустим,...

Приведение типов
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f и float a =...

приведение типов
Объясните, пожалуйста, почему возникает такая ошибка: error C2666: 'operator *' : 4 overloads have...

Приведение типов
Есть код вызова метода: obj.func(char a, char b) сам метод: void func(char a, char b) { int i...

35
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.05.2015, 23:10 2
strcat дописывает второй параметр в первый!
Нельзя в "Katya " дописать что-то, т.к. это строковой литерал, который является константным.
0
15 / 15 / 4
Регистрация: 11.11.2014
Сообщений: 122
26.05.2015, 23:16  [ТС] 3
castaway, упс. Нехило так лaжанулся. Поправлю.

Хорошо, но вопрос остался: как перегрузить операцию сложения, чтобы происходило автоматическое приведение char к String, если такое вообще можно сделать. Как сделать приведение к стандартным типам я догадываюсь. Или здесь можно использовать что-то типа:

C++ (Qt)
1
void String char* ();
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.05.2015, 23:23 4
Цитата Сообщение от Kapex Посмотреть сообщение
как перегрузить операцию сложения, чтобы происходило автоматическое приведение char к String
У тебя и так всё приводится. Проблема в реализации перегруженной операции, о которой я сказал выше.
1
15 / 15 / 4
Регистрация: 11.11.2014
Сообщений: 122
27.05.2015, 21:47  [ТС] 5
castaway, да, приводится, действительно. Попробовал, теперь всё фунциклирует подобающим образом. Спасибо.

Если я правильно понимаю, то в стандартных библиотеках С нет функции, которая возвращает сумму двух строк без изменений слагаемых строк. У меня получилось так, можно ли проще?

C++ (Qt)
1
2
3
4
5
6
7
8
9
String operator+(const String & st1, const String & st2) 
{
    char * c = new char[st1.len+st2.len+1];
    std::strcat(c, st1.str);
    std::strcat(c, st2.str);
    String a(c);
    delete [] c;
    return a;   
}
А пока пойду посмотрю, как это правильные пацаны реализовали.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.05.2015, 21:56 6
Цитата Сообщение от Kapex Посмотреть сообщение
У меня получилось так, можно ли проще?
Если не менять функционал класса String, то нет, нельзя.
0
15 / 15 / 4
Регистрация: 11.11.2014
Сообщений: 122
27.05.2015, 22:03  [ТС] 7
castaway, глянул я файлик basic_string.h... тихо рыдаю в уголке ))
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.05.2015, 22:10 8
String - это твой класс.
0
15 / 15 / 4
Регистрация: 11.11.2014
Сообщений: 122
27.05.2015, 22:31  [ТС] 9
Не поспоришь. Но пока далеко до гуру. Так что пойду ботать матчасть.
0
castaway
27.05.2015, 22:39
  #10

Не по теме:

Цитата Сообщение от Kapex Посмотреть сообщение
Так что пойду ботать матчасть.
Ход мысли правильный.
Но ты можешь задавать адекватные вопросы.

0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
27.05.2015, 22:47 11
правильные пацаны через оператор += делают, который не свободная функция, а метод.
но внутри придется чем-то похожим заниматься. наращивать внутренний буфер, копировать в него строки, а старый удалять.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.05.2015, 23:06 12
Цитата Сообщение от Perfilov Посмотреть сообщение
правильные пацаны через оператор += делают, который не свободная функция, а метод.
А через бинарный плюс делаю неправильные пацаны? Который тоже кстати может быть методом.
Мне почему-то кажется, что тебе тоже стоит
Цитата Сообщение от Kapex Посмотреть сообщение
ботать матчасть.
..
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
27.05.2015, 23:10 13
да можно конечно и без +=, но признанные авторитеты советуют поступать как с int. врятли вы об этом не слышали.
если есть операция += (а чего бы ей не быть, такая же полезная штука как и +), то было бы правильно
и проще реализовать operator + через уже реализованный operator +=. Разве нет?

добавлю, что если бинарный плюс в виде метода делается, тогда теряется некоторая гибкость:
"str" + String() - не скомпилится, т.к. тут автопреобразование в String не сработает.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.05.2015, 23:15 14
Цитата Сообщение от Perfilov Посмотреть сообщение
то было бы правильно и проще реализовать operator + через уже реализованный operator +=. Разве нет?
Возможно. Пример можно!?
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
27.05.2015, 23:20 15
что оператор += уже есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
String operator + (const String& lhs, const String& rhs)
{
  String str(lhs);
  str += rhs;
  return str;
}
 
//ну или:
String operator + (String lhs, const String& rhs)
{
  return lgs += rhs;
}
Про эффективность речи пока не было. Если вдруг зайдет, то и тот и другой оператор наверно
лучше будет делать через какие-нибудь общие спец методы или функции.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.05.2015, 23:24 16
Мм.. Поясни.
Я так понимаю, ты привёл плохой пример и хороший? Или что?
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
27.05.2015, 23:29 17
они одинаковые. второй - для любителей сокращать количество строк
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.05.2015, 23:31 18
Сигнатуры операторов не соответствуют. Ты не заметил?
Ты где таких "авторитетов" нашел?
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
27.05.2015, 23:34 19
елки палки, ты меня подловить на чем-то пытаешься чтоли?
сигнатуры не совпадают специально. иначе к константному аргументу lhs нельзя будет применить неконстантный operator +=.
для остального кода это все пройдет незаметно до тех пор, пока кто-то не заложится на сигнутуру в коде с каким-нибудь указателем на функцию.

суть изначального сообщения остается той же: через operator += оператор + реализуется легко и просто.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
27.05.2015, 23:52 20
Цитата Сообщение от Perfilov Посмотреть сообщение
елки палки, ты меня подловить на чем-то пытаешься чтоли?
Нет. Просто я всё больше убеждаюсь в том, что твои "авторитеты" таковыми не являются.

Цитата Сообщение от Perfilov Посмотреть сообщение
сигнатуры не совпадают специально. иначе к константному аргументу lhs нельзя будет применить неконстантный operator +=.
Это и дураку понятно. У ТС они константные.
Допустим тебе нужны константные. Что же, уже не сработает? Упс...

Я говорю о правильном подходе, а не о через-жопном.
0
27.05.2015, 23:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2015, 23:52
Помогаю со студенческими работами здесь

Приведение типов
Всем привет) Есть массив int a = {2 ,4 ,5 ,6 ,256} Числа располагаются по байтам в памяти так:...

Приведение типов
В паскале можно привести типы: type ts = 0..9; chislo = array of ts; Как это сделать на С++?

Приведение типов
Доброго времени суток. Пусть имеются две структуры struct Student { string FirstName;...

Приведение типов
В чем различие привидения типа (type)expression, от type(expression)?


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

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