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

Перегрузка оператора + - C++

Восстановить пароль Регистрация
 
Сонца
 Аватар для Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
10.11.2013, 13:20     Перегрузка оператора + #1
C++
1
2
3
4
5
6
7
8
String String::operator + (String & sg2)
{
    String tmp;
    tmp.str = new char [tmp.size = size + sg2.size];
    strcpy (tmp.str, str);
    strcat (tmp.str, sg2.str);
    return tmp;
}
Собственно вопрос: как вернуть tmp? Насколько я понимаю, деструктор срабатывает раньше...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 13:20     Перегрузка оператора +
Посмотрите здесь:

C++ Перегрузка оператора ==
перегрузка оператора + C++
C++ Перегрузка оператора >
C++ Перегрузка оператора =
C++ Перегрузка оператора []
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
10.11.2013, 13:32     Перегрузка оператора + #2
Так и вернуть. Деструктор не сработает.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.11.2013, 13:54     Перегрузка оператора + #3
Сонца, Вы бы лучше свой String показали.
Цитата Сообщение от Сонца Посмотреть сообщение
tmp.str = new char [tmp.size = size + sg2.size];
Выделять память под внутренние поля надо бы в конструкторе (или аллокаторе), а не где попало.
Оператор+ должен принимать константную ссылку и быть константным.
Цитата Сообщение от castaway Посмотреть сообщение
Деструктор не сработает.
tmp локальная переменная внутри функции, поэтому, если не полагаться на RVO для нее будет вызван деструктор. Не помешало бы еще на оператор присваивания и копирующий конструктор посмотреть.
Сонца
 Аватар для Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
10.11.2013, 13:54  [ТС]     Перегрузка оператора + #4
castaway,
Тогда подскажите где я не права?
Через дебагер удалось узнать, что tmp в operator+ получается нужный, но до main не доходит или не присваивается.
C++
1
2
3
4
5
6
7
8
9
int main()
{
    String sg1 ("Hello world");
    String sg2 (", hello friend!");
    String sg3;
    sg3 = sg1 + sg2;
 
    return 0;
}
Tulosba,


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class String
{
    enum {Max = 80};
    char * str;
    int size;
public:
    String ();
    String (int);
    String (char *);
    String (const String & obj);
    ~String();
    void UserFill ();
    void Print ();
    String operator + (String & sg2);
    String operator = (String & sg2);
};
String::String ()
{
    str = nullptr;
    size = 0;
}
String::String (int size)
{
    str = new char [size];
    this->size = size;
}
String::String (char * str)
{
    this->str = new char [size = (strlen (str) + 1)];
    strcpy (this->str, str);
}
String::String (const String & obj) : size (obj.size)
{
    str = new char [size];
    strcpy (str, obj.str);
}
String::~String()
{
    delete []str;
    size = 0;
}
String String::operator + (String & sg2)
{
    String tmp;
    tmp.str = new char [tmp.size = size + sg2.size];
    strcpy (tmp.str, str);
    strcat (tmp.str, sg2.str);
    return tmp;
}
String String::operator = (String & sg2)
{
    return String (sg2);
}
Крюгер
10.11.2013, 14:00
  #5

Не по теме:

судить об отдельных частях кода не целесообразно не видя всей картины

Сонца
10.11.2013, 14:05  [ТС]
  #6

Не по теме:

Крюгер, пост

castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
10.11.2013, 14:24     Перегрузка оператора + #7
У тебя оператор присваивания не правильно работает. Правильнее будет так.
C++
1
2
3
4
5
6
7
String & String::operator = (const String & sg2)
{
    str = new char [sg2.size];
    strcpy( str, sg2.str );
    size = sg2.size;
    return *this;
}
Сонца
 Аватар для Сонца
23 / 23 / 6
Регистрация: 20.06.2013
Сообщений: 83
10.11.2013, 14:28  [ТС]     Перегрузка оператора + #8
castaway, большое человеческое спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2013, 14:30     Перегрузка оператора +
Еще ссылки по теме:

C++ Перегрузка оператора <<
C++ Перегрузка оператора +
C++ Перегрузка оператора [][]

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

Или воспользуйтесь поиском по форуму:
Крюгер
10.11.2013, 14:30     Перегрузка оператора +
  #9

Не по теме:

не помог, Iladno

Yandex
Объявления
10.11.2013, 14:30     Перегрузка оператора +
Ответ Создать тему
Опции темы

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