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

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

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

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

27.11.2014, 01:49. Просмотров 235. Ответов 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++
Вобщем вопрос к людям сведущим, как вышло что строчка char * temp = new char ; создает массив непонятной длинны никак не равной десяти,...

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

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

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

Какая разница? - C++
Я уже довольно долго изучаю С++ и столкнулся с проблемой: чем отличается cout от printf, так как я всегда пользовался cout, не могу понять...

Какая-то ошибка - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main () { ifstream in(&quot;input.txt&quot;); ofstream...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 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Эксперт С++
13056 / 7319 / 817
Регистрация: 27.09.2012
Сообщений: 18,060
Записей в блоге: 3
Завершенные тесты: 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";
и посмотреть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2014, 01:19     Какая-то мистика с if
Еще ссылки по теме:

Ерунда какая-то с С++ - C++
Помогите плиз прогу написал нажимаю скомпилировать он выдвёт оконце на долю секунды и пишет: не указан исходный фаил, а иногда окно...

Какая разница?! - C++
Вот две сортировки массивов, если не трудно обьясните пожалуйста разницу и есть ли указатели тут: bool foo(double i,double j) { ...

Какая у буста лицензия? - C++
Если я использую boost, должен ли я буду весь проект распространять бесплатно и открыть исходный текст?

Какая необходима книга ? - C++
Здравствуйте. Есть игра,в которую можно подключать свою библиотеку. Я бы хотел узнать,какую книгу можно почитать,где рассказывалось бы,как...


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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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