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

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

Восстановить пароль Регистрация
 
takecashman
1 / 1 / 0
Регистрация: 23.05.2013
Сообщений: 33
27.11.2014, 01:49     Какая-то мистика с if #1
Программа работает нормально, но если я убираю проверку в перегрузке оператора + условие 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++
Мистика ? - Хранимые процедуры & VC++ (ADO) C++
C++ DrawText win api - Мистика =)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 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
Ответ Создать тему
Опции темы

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