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

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

Восстановить пароль Регистрация
 
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
31.05.2014, 23:46     Перегрузка "operator =" #1
Не пойму чего возвращать из 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;
};
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11835 / 6814 / 769
Регистрация: 27.09.2012
Сообщений: 16,889
Записей в блоге: 2
Завершенные тесты: 1
31.05.2014, 23:50     Перегрузка "operator =" #2
C++
1
2
//Присваиваете всё что нужно и возвращаете ссылку на данный объект.
return *this ;
ну и const добавить не мешает. Более не вчитывался.
C++
1
operator =(const String_1 &S)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.05.2014, 23:56     Перегрузка "operator =" #3
Дъячелли, возвращать ссылку или указатель на локальный объект - это ошибка. Зачем называть класс String_1 тоже не понятно. И послушайте Croessmah.
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
01.06.2014, 00:16  [ТС]     Перегрузка "operator =" #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);
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.06.2014, 00:20     Перегрузка "operator =" #5
Цитата Сообщение от Дъячелли Посмотреть сообщение
не все равно ошибка вылетает сейчас присваивание покажу
пунктуацию в школе проходили?
Полный код приводите, и текст ошибки.
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
01.06.2014, 00:49  [ТС]     Перегрузка "operator =" #6
Перегрузка "operator ="
в общем вот такая вот ошибка после return

Добавлено через 17 минут
В полном коде уже 250 строк и еще 6 файлов, маленьких правда
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.06.2014, 05:26     Перегрузка "operator =" #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;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,180
Завершенные тесты: 1
01.06.2014, 09:32     Перегрузка "operator =" #8
А почему так нельзя?
C++
1
2
3
4
5
String_1& String_1::operator =(String_1 &S)
{
    strcpy(this->str,S.str);
    return *this;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.06.2014, 11:17     Перегрузка "operator =" #9
Цитата Сообщение от zss Посмотреть сообщение
А почему так нельзя?
Потому что в приемнике (this) может не быть достаточного кол-ва памяти.
P.S. да и константность ссылки аргумента опять потеряна.
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
02.06.2014, 11:39  [ТС]     Перегрузка "operator =" #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Память портите. Вот здесь памяти мало выделяете (под '\0' не хватит)
Разве? Ведь цикл крутится пока j строго меньше i, т.е привыходе не получается что j<i на единицу?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 13:21     Перегрузка "operator =" #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;
}
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
03.06.2014, 22:40  [ТС]     Перегрузка "operator =" #12
Ваш код много изящней моего тяп-ляпа
И да загвоздка оказалась именно в той самой не хватке.
Спасибо всем, большое .
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.06.2014, 22:55     Перегрузка "operator =" #13
alsav22, кстати, для эффективности присваивания обычно правильнее убрать проверку на присваивание самому себе, и выделять память, копировать (перемещать) в любых ситуациях. Это обусловлено тем, что присваивание самому себе не такая частая операция, как присваивание другому объекту, и лишняя проверка только занизит общую скорость.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.06.2014, 23:13     Перегрузка "operator =" #14
Tulosba, может быть и так. Пишу, как в учебниках пишут.
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
03.06.2014, 23:40  [ТС]     Перегрузка "operator =" #15
Тут еще кто-нибудь есть? У меня вопрос такой, вот то что ниже одновременно возможно ? или все таки при таком конструкторе базовый класс должен включать указатели на int, а не сам int

* базовый класс Х, включающий два элемента х1, х2 типа int,
* конструктор с параметрами для создания объектов в динамической области памяти,
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2014, 08:30     Перегрузка "operator ="
Еще ссылки по теме:

Перегрузка оператора "++" и "--" , компилирует, но при запуске программы - ошибка C++
Класс "Матрица". Перегрузка оператора "минус" C++
Перегрузка оператора "+", чтобы выполнял "*" C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
04.06.2014, 08:30     Перегрузка "operator =" #16
Дъячелли, при вызове new X(); весь объект X (т.е. и его члены x1, x2) будет расположен в динамической памяти.
Причем тут базовый класс вообще не понятно.
Yandex
Объявления
04.06.2014, 08:30     Перегрузка "operator ="
Ответ Создать тему
Опции темы

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