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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
MrAndrey_ka
77 / 77 / 2
Регистрация: 13.05.2009
Сообщений: 536
Записей в блоге: 1
#1

свой строковой тип - C++

13.05.2011, 18:20. Просмотров 1157. Ответов 5
Метки нет (Все метки)

помогите пожалуйста разобраться со строковым типом!
пишу свой класс строки, запнулся на реализации оператора +
есть вот такие виды операторов + и =
C++
1
2
3
4
void operator =(const WCHAR *val);
void operator =(const MyStr &val);
const MyStr operator +(const WCHAR *val);
const MyStr operator +(const MyStr &val);
теперь пишу следующее:
C++
1
2
3
4
MyStr s;
s=L"Привет ";
s=s+L" народ!";
s=s+L"  "+s;
ругается на 4-ую строчку:
1>d:\docs\visual studio 2008\projects\directdraw\directdraw\directdraw.cpp(76) : error C2678: бинарный '+': не найден оператор, принимающий левый операнд типа 'const MyStr' (или приемлемое преобразование отсутствует)
1> d:\docs\visual studio 2008\projects\bpl\class.h(27): может быть 'const MyStr MyStr::operator +(const WCHAR *)'
1> d:\docs\visual studio 2008\projects\bpl\class.h(28): или 'const MyStr MyStr::operator +(const MyStr &)'
1> при попытке сопоставить список аргументов '(const MyStr, MyStr)'

помогите плиз с этим разобраться...

исходник класса прилагается
Вложения
Тип файла: rar str.rar (1.6 Кб, 10 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2011, 18:20     свой строковой тип
Посмотрите здесь:

Создать свой целочисленный тип данных C++
Как создать свой собственный тип на C++? C++
Не получается создать свой тип данных C++
Как сконвертировать свой тип в тип double? C++
Как реализовать свой тип данных C++
C++ Задать свой числовой тип с заданным допустимым диапазоном
C++ Свой тип Boolean
Свой тип равный одному байту для хранения числа в 3-ой системе счисления C++
C++ Как создать свой целочисленный тип данных с пределом от 0 до 500
C++ Свой тип как параметр шаблона
C++ Создать свой тип данных
Свой тип данных для перегрузки функций C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
13.05.2011, 23:16     свой строковой тип #2
Попробуйте возвращать из operator+ без const.
У меня лично не работает, так как GCC не знает всяких костылей типа Byte.
А еще, так как конструктор с WCHAR объявлен без explicit, то создание дополнительного operator+ для WCHAR не требуется - тип будет приведен к MyStr на основе конструктора.
А operator= по идее должен возвращать ссылку на свой экземпляр класса, а не void.
MrAndrey_ka
77 / 77 / 2
Регистрация: 13.05.2009
Сообщений: 536
Записей в блоге: 1
16.05.2011, 11:18  [ТС]     свой строковой тип #3
Попробуйте возвращать из operator+ без const.
У меня лично не работает, так как GCC не знает всяких костылей типа Byte.
А еще, так как конструктор с WCHAR объявлен без explicit, то создание дополнительного operator+ для WCHAR не требуется - тип будет приведен к MyStr на основе конструктора.
А operator= по идее должен возвращать ссылку на свой экземпляр класса, а не void.
Byte это unsigned char;
в таком выражении s=s+L"abc "; вызывается оператор MyStr operator +(const WCHAR *val);
из operator+ убрал constи заработало, большое спасибо!

Добавлено через 14 минут
теперь возник второй вопрос, добавил
C++
1
2
3
MyStr operator +(int val);
inline void operator =(int val){IntToStr(val);}
inline void operator =(float val){FloatToStr(val);}
когда пишу s=45;все хорошо, но когда пишу s=45+L"_";
компилятор увеличивает адрес строки... можно как то сделать чтобы работало правильно, или так не получится?
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
16.05.2011, 12:26     свой строковой тип #4
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
Byte это unsigned char;
Внимание правильный ответ:
Byte - это борландовский костыль, который не нужен.

Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
в таком выражении s=s+L"abc "; вызывается оператор MyStr operator +(const WCHAR *val);
Вы либо не читали, либо не поняли. Если конструктор объявлен без атрибута explicit, то он будет использоваться компилятором для автоматического приведения типов. В частности, вашим конструктором MyStr(const WCHAR*) будет приведена любая строка WCHAR'ов к типу вашего класса автоматически.

Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
теперь возник второй вопрос, добавил
C++
1
2
3
MyStr operator +(int val);
inline void operator =(int val){IntToStr(val);}
inline void operator =(float val){FloatToStr(val);}
когда пишу s=45;все хорошо, но когда пишу s=45+L"_";
компилятор увеличивает адрес строки... можно как то сделать чтобы работало правильно, или так не получится?
В каком месте увеличивает адрес строки?

C++
1
MyStr operator +(int val);
Тут можно возвращать по ссылке

C++
1
inline
Методы класса не нужно объявлять inline - по стандарту C++ они будут созданы как inline, по возможности, автоматически.

C++
1
IntToStr
Я так понимаю, это очередной борландовский костыль? А разве его возвращаемое значение не нужно передать указателю на хранимую строку?
MrAndrey_ka
77 / 77 / 2
Регистрация: 13.05.2009
Сообщений: 536
Записей в блоге: 1
16.05.2011, 16:40  [ТС]     свой строковой тип #5
Цитата Сообщение от Jtalk Посмотреть сообщение
Вы либо не читали, либо не поняли. Если конструктор объявлен без атрибута explicit, то он будет использоваться компилятором для автоматического приведения типов. В частности, вашим конструктором MyStr(const WCHAR*) будет приведена любая строка WCHAR'ов к типу вашего класса автоматически.
я говорю о том он не используется компилятором для автоматического приведения типов, а вызывается оператор +(WCHAR), проверял пошагово, заходит в него, а не создает новый экземпляр строки.

вот такое выражение s=L"CH: ";s=s+25+L" - "; возвращает строку "CH:25 - "
а вот такое s=25+L" - "; выкидует ошибку, так как к указателю на L" - " добавляется 25 и полученный указатель передается в operator =(WCHAR), и естественно возникает ошибка...
вот и спрашиваю можно ли как то это обойти?

хотя если продолжить тему то любое выражение не начинающееся с MyStr не работает как нужно
например s=L"Привет"+L" народ!"; выдает error C2110: +: невозможно добавить два указателя

помоги плиз это обойти
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
16.05.2011, 16:48     свой строковой тип #6
Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
я говорю о том он не используется компилятором для автоматического приведения типов, а вызывается оператор +(WCHAR), проверял пошагово, заходит в него, а не создает новый экземпляр строки.
Будет использоваться, если убрать operator+ (WCHAR*); Собственно я об этом и говорю, что можно было не реализовывать это в данном случае.

Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
вот такое выражение s=L"CH: ";s=s+25+L" - "; возвращает строку "CH:25 - "
Значит криво реализован operator+(int) либо operator+(MyStr), трассируйте их и посмотрите, где обрезается строка.

Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
вот такое s=25+L" - "; выкидует ошибку, так как к указателю на L" - " добавляется 25 и полученный указатель передается в operator =(WCHAR), и естественно возникает ошибка...
вот и спрашиваю можно ли как то это обойти?
Добавьте
C++
1
friend WCHAR* operator+(int,WCHAR*);
И реализуйте его вне пространства класса.


Цитата Сообщение от MrAndrey_ka Посмотреть сообщение
хотя если продолжить тему то любое выражение не начинающееся с MyStr не работает как нужно
например s=L"Привет"+L" народ!"; выдает error C2110: +: невозможно добавить два указателя
И это хорошо ©
Yandex
Объявления
16.05.2011, 16:48     свой строковой тип
Ответ Создать тему
Опции темы

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