Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Сонца
23 / 23 / 10
Регистрация: 20.06.2013
Сообщений: 83
1

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

10.11.2013, 13:20. Просмотров 336. Ответов 8
Метки нет (Все метки)

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? Насколько я понимаю, деструктор срабатывает раньше...
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 13:20
Ответы с готовыми решениями:

Перегрузка оператора ~
Доброго времени суток! Помогите пожалуйста с решением задачи. Описать класс множество целых...

Перегрузка оператора =
Есть некий класс. И два класса-наследника. Надо перегрузить оператор =, к тому же в дочерних...

Перегрузка оператора
Есть такой вот код: #include <iostream> using namespace std; template <class T> class LIST {...

Перегрузка оператора ++
Написал префиксную перегрузку ++ Vremya &Vremya::operator ++ () { int sec =...

Перегрузка оператора
Помогите, товарищи, пожалуйста. пытаюсь перегрузить оператор для того, чтобы можно было складывать...

8
castaway
Эксперт С++
4953 / 3059 / 456
Регистрация: 10.11.2010
Сообщений: 11,151
Записей в блоге: 10
Завершенные тесты: 1
10.11.2013, 13:32 2
Так и вернуть. Деструктор не сработает.
0
Tulosba
:)
Эксперт С++
4759 / 3253 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.11.2013, 13:54 3
Сонца, Вы бы лучше свой String показали.
Цитата Сообщение от Сонца Посмотреть сообщение
tmp.str = new char [tmp.size = size + sg2.size];
Выделять память под внутренние поля надо бы в конструкторе (или аллокаторе), а не где попало.
Оператор+ должен принимать константную ссылку и быть константным.
Цитата Сообщение от castaway Посмотреть сообщение
Деструктор не сработает.
tmp локальная переменная внутри функции, поэтому, если не полагаться на RVO для нее будет вызван деструктор. Не помешало бы еще на оператор присваивания и копирующий конструктор посмотреть.
0
Сонца
23 / 23 / 10
Регистрация: 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);
}
0
10.11.2013, 13:54
Крюгер
10.11.2013, 14:00
  #5

Не по теме:

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

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

Не по теме:

Крюгер, пост

0
castaway
Эксперт С++
4953 / 3059 / 456
Регистрация: 10.11.2010
Сообщений: 11,151
Записей в блоге: 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;
}
1
Сонца
23 / 23 / 10
Регистрация: 20.06.2013
Сообщений: 83
10.11.2013, 14:28  [ТС] 8
castaway, большое человеческое спасибо!
0
Крюгер
10.11.2013, 14:30     Перегрузка оператора +
  #9

Не по теме:

не помог, Iladno

0
10.11.2013, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2013, 14:30
Привет! Вот еще темы с ответами:

Перегрузка оператора
Имеется время, например 12:12:12 Перегрузка инкремента Time &Time::operator ++ () { ...

Перегрузка оператора =
Ввести строку символов S1. Программа должна содержать перегруженную операцию “=”, использование...

Перегрузка оператора +=
Создал класс дробь. Пытаюсь перегрузить оператор += (или -=, *=, /=) А компилятор выдаёт ошибку...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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