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

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

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

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

27.11.2014, 01:49. Просмотров 242. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какая-то мистика с if (C++):

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

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

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

Мистика при удалении из бинарного дерева поиска ! - C++
Привет народ !) Пытаюсь создать функцию удаления листа из бинарного дерева поиска : template&lt;typename NODETYPE&gt; void...

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

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

4
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,369
Завершенные тесты: 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
Эксперт CЭксперт С++
13512 / 7670 / 866
Регистрация: 27.09.2012
Сообщений: 18,870
Записей в блоге: 3
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

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

Вывод банера(файла) из БД,мистика какая то твориться! Подкинте идей! - PHP БД
сложилась такая ситуация &lt;div id=&quot;adw_rotator&quot;&gt; &lt;?$res=db_select(&quot;select * from reklama where position='1' and page='index'&quot;); ...

Определить какая из точек лежит на окружности, какая внутри окружности, а какая вне окружности - VBA
Не могу не как понять какую формулу писать Вот задания Заданы координаты двух точек А(х,у) и В(х,у) и радиус окружности r. Определить...

Мистика - MySQL
Мистика


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

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

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