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

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

27.11.2014, 01:49. Просмотров 260. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 01:49
Ответы с готовыми решениями:

Массивы Мистика, 2008 VS, C++
Вобщем вопрос к людям сведущим, как вышло что строчка char * temp = new char ; создает массив...

DrawText win api - Мистика =)
Начинал изучать C++ на FreeBSD, собирал мейкфайлы и горя не знал. Полез в винде разбираться с её...

Необъяснимая мистика при наследовании класса
есть два класса: class AllData { protected: int id; int x; int y; public: AllData(int...

Мистика ? - Хранимые процедуры & VC++ (ADO)
Что то я совсем ничерта не понимаю!!! Есть хранимая процедура типа(даже такой упрощенный код не...

Мистика при удалении из бинарного дерева поиска !
Привет народ !) Пытаюсь создать функцию удаления листа из бинарного дерева поиска : ...

4
hoggy
Нарушитель
Эксперт С++
7081 / 3125 / 647
Регистрация: 15.11.2014
Сообщений: 7,172
Завершенные тесты: 1
27.11.2014, 02:14 2
1. operator+ реализован не корректно.
Он должен возвращать копию нового объекта, а не модифицировать левостоящий.

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

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

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

http://rextester.com/FVFQ40381

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

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

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

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

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

В реальном проекте это может вызвать общие проблемы сопровождения продуктов компании, и в особенности при взаимодействии вашего кода с кодом сторонних библиотек.
0
takecashman
1 / 1 / 0
Регистрация: 23.05.2013
Сообщений: 33
01.12.2014, 00:59  [ТС] 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;
}
0
Croessmah
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,557
Записей в блоге: 2
Завершенные тесты: 1
01.12.2014, 01:06 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";
и посмотреть
0
takecashman
1 / 1 / 0
Регистрация: 23.05.2013
Сообщений: 33
01.12.2014, 01:19  [ТС] 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;
}
0
01.12.2014, 01:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2014, 01:19

мистика какая-то
код приведенный ниже я пошагово прохожу в отладчике for e:=1 to high(win) do if Y &gt; win then...

Мистика какая-то
Здравствуйте! Первый раз создаю тему на этом форуме по этому возможно она не совсем в том разделе....

Какая-то мистика. Загружаю комп, выхожу на рабочий стол и.... и все
Проблема такая: загружаю комп, выхожу на рабочий стол и.... и все. Дальше ничего не работает. Ни...


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

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

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