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

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

Войти
Регистрация
Восстановить пароль
 
takecashman
1 / 1 / 0
Регистрация: 23.05.2013
Сообщений: 33
#1

Какая-то мистика с if - C++

27.11.2014, 01:49. Просмотров 219. Ответов 4
Метки нет (Все метки)

Программа работает нормально, но если я убираю проверку в перегрузке оператора + условие if, то функция strcat не склеивает...
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
54
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <clocale>
using namespace std;
 
class strtype {
    char *p;
    int len;
public:
    strtype(char *s);
    ~strtype() {delete []p;}
    char *get() {return p;}
    strtype &operator+(strtype &ob);
};
 
strtype::strtype(char *s)
{
    int l;
    l = strlen(s) + 1;
    p = new char [l];
    len = l;
    strcpy(p, s);
}
 
// переопределить операцию "+"
strtype &strtype::operator+(strtype &ob)
{
    int l;
// выяснение необходимости дополнительной памяти
    if(len < ob.len) { // требуется выделение дополнительной памяти
        delete []p;
        l = len + ob.len;
        p = new char [l];
 
    }
    strcat(p, ob.p);
    return *this;
}
 
int main()
{
    setlocale(LC_ALL,"");
    strtype a("Программист "), b("Леша");
 
    cout << a.get() << "\n";
    cout << b.get() << "\n";
 
    a + b; // вызываем перегрузку +
 
    cout << a.get() << '\n';
    system("PAUSE");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 01:49     Какая-то мистика с if
Посмотрите здесь:

Массивы Мистика, 2008 VS, C++ C++
C++ Какая разница?!
Ерунда какая-то с С++ C++
Какая разница в инициализации? C++
Мистика ? - Хранимые процедуры & VC++ (ADO) C++
C++ DrawText win api - Мистика =)
C++ Какая-то ошибка
Какая разница? C++
C++ Какая нужна библиотека?
Какая скорость ввода gets? C++
Мистика при удалении из бинарного дерева поиска ! C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5715 / 2306 / 417
Регистрация: 15.11.2014
Сообщений: 5,150
Завершенные тесты: 1
27.11.2014, 02:14     Какая-то мистика с if #2
1. operator+ реализован не корректно.
Он должен возвращать копию нового объекта, а не модифицировать левостоящий.

2. Но даже согласно действующей логике он все равно реализован не корректно.
Потому что объект модифицируется: склеивается. Но при этом значение len не изменяется.
И таким образом, после склейки данные объекта не корректны.

3. Если убрать проверку if, то это вообще получится порча памяти. Последствия не предсказуемы.

4. На онлайн компиляторе работает. Однако это чистое везение:

http://rextester.com/FVFQ40381

5. Длина не может быть отрицательной. Количество не может быть отрицательным.
Не может быть минус 2 яблока, или -10 символов в строке.

Поэтому, использование типа int для этой цели - некорректно.

На языке с++ существует специальный тип данных: size_t, который гарантирует, что в нем можно сохранить размер любого, теоретически самого большого объекта, какой только может быть на данной платформе.

Тип данных int таких гарантий не предоставляет. Рекомендую вам не использовать его для этих целей.

6. Отсутствие квалификатора const выдает дилетанта.

В реальном проекте это может вызвать общие проблемы сопровождения продуктов компании, и в особенности при взаимодействии вашего кода с кодом сторонних библиотек.
takecashman
1 / 1 / 0
Регистрация: 23.05.2013
Сообщений: 33
01.12.2014, 00:59  [ТС]     Какая-то мистика с if #3
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
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <clocale>
using namespace std;
 
class strtype {
    char *p;
    int len;
public:
    strtype(){ len = 0;p = new char ('\0');}
    strtype(char *s);
    ~strtype() {delete[] p;}
    char *get() {return p;}
    strtype &operator+(strtype &ob);
};
 
strtype::strtype(char *s)
{
    len = strlen(s) + 1;
    p = new char [len];
    strcpy(p, s);
}
 
// переопределить операцию "+"
strtype &strtype::operator+(strtype &ob)
{
    strcat(p, ob.p);
    return *this;
}
 
int main()
{
    setlocale(LC_ALL,"");
    strtype a("Программист "), b("Леша"),c;
 
    cout << a.get() << "\n";
    cout << b.get() << "\n";
 
    c = a + b; // вызываем перегрузку +
    cout << c.get() << "\n";
    system("PAUSE");
    return 0;
}
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12508 / 7070 / 794
Регистрация: 27.09.2012
Сообщений: 17,457
Записей в блоге: 2
Завершенные тесты: 1
01.12.2014, 01:06     Какая-то мистика с if #4
C++
1
2
3
4
5
strtype &strtype::operator+(strtype &ob)
{
    strcat(p, ob.p);
    return *this;
}
1) может параметру дать квалификатор const?
2) когда Вы делаете с int'ами c = a + b, Вы ожидаете, что переменная "a" изменится?

Добавлено через 3 минуты
Предлагаю строчку
C++
1
cout << c.get() << "\n";
переделать на
C++
1
cout << a.get() << "\n";
и посмотреть
takecashman
1 / 1 / 0
Регистрация: 23.05.2013
Сообщений: 33
01.12.2014, 01:19  [ТС]     Какая-то мистика с if #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
strtype::strtype(char *s)
{
    len = strlen(s);
    p = new char [len];
    strcpy(p, s);
}
 
// переопределить операцию "+"
strtype &strtype::operator+(strtype &ob)
{   strtype temp(p);
    delete[] p;
    strcat(temp.p, ob.p);
    cout<< temp.get() << endl;
}
Yandex
Объявления
01.12.2014, 01:19     Какая-то мистика с if
Ответ Создать тему
Опции темы

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