![]() |
|
Модераторы: bsa |
![]()
|
|
| initmax |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
Доброго, требуется перегрузить операторы для работы со строками
дабы можно было осуществлять такие записи
но пока удалось реализовать только это:
что подскажите?
|
||||||
|
|||||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 5 Всего: 10 |
если это С++
#include <stdio.h> - cstdio #include <iostream.h> #include <string.h> - без .h и вместо char* _str проще std::string или std::vector<char> |
|||
|
||||
| 586 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 8 Всего: 146 |
Ошибка: выход за пределы массива - Нужно ещё место для символа '\0' в конце строки:
|
||||
|
|||||
| xvr |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Почему бы не сделать просто
Опрератор -= делает вообще что то непонятное Это const mString& mString::operator=(mString &string) должно быть таким mString& mString::operator=(const mString &string) И последнее (добавить в описание класса)
Это сообщение отредактировал(а) xvr - 16.12.2009, 12:28 |
||||||||||||
|
|||||||||||||
| initmax |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
Переделал
работает, но на cout<<str1+str2; первое слово выводит крокоязбрами, хотя cout<<t; в методе
отрабатывает корректно, не отрабатывает конструктор копирования? допиться таких возможностей // a += b; // a = "asd" + b ; // c = a = b; можно только благодаря перегрузке функций? |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
operator += описан неправильно, должно быть так:
|
|||
|
||||
| initmax |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
касательно возможности записать так:
Организовал перегрузку функций
и добаивл езё один метод
всё работает, подход верный? |
||||||
|
|||||||
| xvr |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Несколько избыточно. Достаточно сделать оператор const mString operator+(const mString &strL, const mString &strR). Тогда для "aaa"+str компилятор автоматически посторит operator+(mString("aaa"),str)
|
||||||||||
|
|||||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
initmax, не забывай, что "xxxx" преобразуется к const char *, а не к char*, так как менять содержимое строкового литерала нельзя.
|
|||
|
||||
| initmax |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
Поборол практически всё:
Но ни как не могу осилить следующую форму записи z="super hello"+=a; тако мыслю: //1) Переопределить метод +=? для возможности вызова таким образом z="super hello"+=a; //2) Описать ещё одну фцию mString operator+=(const char *str, const mString& s); кто может подсказать? спасибо. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
initmax, такая форма записи недопустима (ты пытаешься изменить rvalue, что недопустимо), именно поэтому бороться с ней не нужно.
|
|||
|
||||
| initmax |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
т.е. Вы хотите сказать что запись плана z="super hello"+=a; реализовать невозможно вовсе?
|
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
возможно, только зачем? Эта запись ошибочна, зачем пытаться подставлять под нее костыли?
Попробую объяснить на пальцах. operator+= возвращает ссылку на объект стоящий слева. В твоем случае - на "super hello"... Но перед этим, этот оператор меняет значение объекта. Таким образом, ты должен добавить к строке "super hello" что-то, затем вернуть ссылку на измененную строку... Этот оператор можно записать следующим образом:
|
||||
|
|||||
| initmax |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 165 Регистрация: 24.7.2009 Репутация: нет Всего: нет |
Такова лаба, в задании такого не было, но преподаватель решил немного пошутить. в данном случае const char(&)[12] operator+=(const char (&v)[12], const MyString &t) смущает статическая размерность массива [12], строка должна подставляться динамической размерности. исходя из Вашего описания:
реализация должны выглядеть следующим образом: 1) выделить память развмерностью в 2 передаваемых строки 2) скопировать в этот участок памяти строку 1 super hello и строку с объекта 3) зачистить за собой память 4) вернуть полученую строку или созданный объект кот. содержит новую строку const char(&)[12] operator+=(const char (&v)[12], const MyString &t) { int l=(strlen(t.getStr())+12); char* nv=new char[l+1]; strcpy(nv,v); strcat(nv,t.getStr()); return *this; } ругается на запсиь определения функции - const char(&)[12] operator+=(const char (&v)[12], const MyString &t) прототип в классе выглядит так const char& operator+=(const char &v, const MyString &); ошибка main.cpp|66|error: ISO C++ forbids declaration of `MyString' with no type| станно, ибо на мой взгляд данная функция должна перегружаться. |
||||
|
|||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
initmax, возможно, причина ошибки в том, что ты не создал класс MyString.
Почему я использовал 12? Потому что это длина строки "super hello" + 1 (на символ '\0') равна 12. Ты можешь, конечно, заменить эту страшную конструкцию на const char* для простоты, но тебе это все равно не поможет. Повторяю, в данном контексте использовать оператор сложения с присваиванием просто нельзя. Ты видимо не понял, запись
Когда ты пишешь: t = "hello" += s, то ты сначала пытаешься сделать "hello" += s, а затем полученный результат присвоить t (не забывай, все операторы присваивания работают справа налево). Но НЕЛЬЗЯ ПРИСВАИВАТЬ КОНСТАНТАМ! Так как "hello" - это константа, которая "вшита" к код программы! |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |