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

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

Войти
Регистрация
Восстановить пароль
 
 
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
#1

Перегрузка "operator =" - C++

31.05.2014, 23:46. Просмотров 447. Ответов 15
Метки нет (Все метки)

Не пойму чего возвращать из operator и так и так кручусь, умом не дохожу, помогите пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
String_1& String_1::operator =(String_1 &S){
    int i=0;
    do i++;
    while(S.str[i]!='\0');
    String_1 s2;
    s2.str=new char[i];
    for(int j=0;j<i;j++){
        s2.str[j]=S.str[j];
    }
    s2.str[i] = '\0';
    return s2;
}
вот сам класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class String_1{
public:
    String_1(void);
    String_1(char*);
    ~String_1();
    
    void Set(char*);
    char* Run();
    String_1 &operator =(String_1&);
 
    friend void Print(String_1&);
    friend char* Run(String_1&);
    
 
private:
    char *str;
};
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2014, 23:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка "operator =" (C++):

Перегрузка "operator =" для шаблона класса - C++
как правильно перегрузить operator= для щаблона, по идее я принимаю 2 ссылки на объекты этого класса и возвращаю 1 из них ... что-то не...

Перегрузка внешней функции операции "operator=" - C++
1) Возможна ли перегрузка внешней функцией операции &quot;operator=&quot;? Чтобы скажем выполнить нечто: int = объект 2) Компилятор (mingw)...

Перегрузка операторов: "operator #" - C++
Здравствуйте, подскажите пожалуйста. перегрузка оператора выглядит: void operator # (int i) В учебнике Шилдт перед словом operator...

Перегрузка "operator +" - C++
Прив, подскажите, как организовать перегрузку, чтобы работало, как надо. У меня такая проблема При перегрузке + оно сразу и...

Перегрузка функций "ввести в поток", "вывести с потока", "умножить вектор на число" - C++
Подскажите пожалуйста, как убрать ошибки с этой программы? (делала перегрузку &quot;ввести в поток&quot; и &quot;вывести с потока&quot;, а также &quot;умножить...

Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" - C++
Здравствуйте. Предлагаю заняться арифметикой. Создал прослейший класс, перегрузил операторы сложения и умножения, в конструкторе...

15
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,633
Записей в блоге: 3
Завершенные тесты: 1
31.05.2014, 23:50 #2
C++
1
2
//Присваиваете всё что нужно и возвращаете ссылку на данный объект.
return *this ;
ну и const добавить не мешает. Более не вчитывался.
C++
1
operator =(const String_1 &S)
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
31.05.2014, 23:56 #3
Дъячелли, возвращать ссылку или указатель на локальный объект - это ошибка. Зачем называть класс String_1 тоже не понятно. И послушайте Croessmah.
1
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
01.06.2014, 00:16  [ТС] #4
не все равно ошибка вылетает сейчас присваивание покажу
C++
1
2
3
4
5
6
7
8
9
String_1 *pstr;
pstr=new String_1();
pstr->Set(s);
cout << "Введенная строка\n";
Print(*pstr);
cout << "Проверка перегрузки оператора =\n";
String_1 str2;
str2=*pstr;
Print(str2);
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.06.2014, 00:20 #5
Цитата Сообщение от Дъячелли Посмотреть сообщение
не все равно ошибка вылетает сейчас присваивание покажу
пунктуацию в школе проходили?
Полный код приводите, и текст ошибки.
0
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
01.06.2014, 00:49  [ТС] #6
Перегрузка "operator ="
в общем вот такая вот ошибка после return

Добавлено через 17 минут
В полном коде уже 250 строк и еще 6 файлов, маленьких правда
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.06.2014, 05:26 #7
Память портите. Вот здесь памяти мало выделяете (под '\0' не хватит):
C++
1
2
3
4
5
6
7
8
9
10
11
12
String_1& String_1::operator =(String_1 &S){
    int i=0;
    do i++;
    while(S.str[i]!='\0');
    String_1 s2;
    s2.str=new char[i]; // !!!
    for(int j=0;j<i;j++){
        s2.str[j]=S.str[j];
    }
    s2.str[i] = '\0';
    return s2;
}
1
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,387
Завершенные тесты: 1
01.06.2014, 09:32 #8
А почему так нельзя?
C++
1
2
3
4
5
String_1& String_1::operator =(String_1 &S)
{
    strcpy(this->str,S.str);
    return *this;
}
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.06.2014, 11:17 #9
Цитата Сообщение от zss Посмотреть сообщение
А почему так нельзя?
Потому что в приемнике (this) может не быть достаточного кол-ва памяти.
P.S. да и константность ссылки аргумента опять потеряна.
2
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
02.06.2014, 11:39  [ТС] #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Память портите. Вот здесь памяти мало выделяете (под '\0' не хватит)
Разве? Ведь цикл крутится пока j строго меньше i, т.е привыходе не получается что j<i на единицу?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 13:21 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Дъячелли Посмотреть сообщение
Ведь цикл крутится пока j строго меньше i, т.е привыходе не получается что j<i на единицу?
При чём здесь j? Память выделяется вот здесь (исходя из величины i):
C++
1
s2.str=new char[i]; // !!!
Величина i, при выходе из цикла while, будет соответствовать индексу '\0', что на единицу меньше количества символов, включая '\0'. Вот это - уже выход за границу выделенной памяти:
C++
1
s2.str[i] = '\0';
Добавлено через 23 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
String_1& String_1::operator =(const String_1 &S)
{
    if (&S == this)
        return *this;
    int i = strlen(S.str);
    delete [] str;
    str = new char[i + 1];
    strcpy(str, S.str);
    
    return *this;
}
1
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
03.06.2014, 22:40  [ТС] #12
Ваш код много изящней моего тяп-ляпа
И да загвоздка оказалась именно в той самой не хватке.
Спасибо всем, большое .
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.06.2014, 22:55 #13
alsav22, кстати, для эффективности присваивания обычно правильнее убрать проверку на присваивание самому себе, и выделять память, копировать (перемещать) в любых ситуациях. Это обусловлено тем, что присваивание самому себе не такая частая операция, как присваивание другому объекту, и лишняя проверка только занизит общую скорость.
1
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.06.2014, 23:13 #14
Tulosba, может быть и так. Пишу, как в учебниках пишут.
0
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
03.06.2014, 23:40  [ТС] #15
Тут еще кто-нибудь есть? У меня вопрос такой, вот то что ниже одновременно возможно ? или все таки при таком конструкторе базовый класс должен включать указатели на int, а не сам int

* базовый класс Х, включающий два элемента х1, х2 типа int,
* конструктор с параметрами для создания объектов в динамической области памяти,
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2014, 23:40
Привет! Вот еще темы с ответами:

Чем "operator *=" отличается от "operator *"? - C++
снова застряла, не могу понять, чем этот оператор должен отличаться от оператора*.....? вот он, но это работает только в случае...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Перегрузка оператора "++" и "--" в чем может быть причина нарушение прав доступа? - C++
Вот такой вот код #include &lt;iostream&gt; class d { private: int size ; char *n; public: d()

Expected init-declarator before "operator".expected `,' or `;' before "operator" - C++
Пример не мой. Пытаюсь у себя запустить и чтото неполучается. Ошибка на строке 24 Expected init-declarator before &quot;operator&quot;.Expected...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.06.2014, 23:40
Ответ Создать тему
Опции темы

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