Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 18

Не работает пример из Шилдта

07.08.2017, 21:53. Показов 1632. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В книге Г. Шилдта "C++ базовый курс" третье издание на страницах 338-339 приведен следующий пример с перегрузкой оператора "=":
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
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
 
class sample {
    char *s;
public:
    sample();
    sample(const sample &ob);
    ~sample() { if(s) delete [] s;
                cout << "Освобождение s-памяти" << endl; }
    void show() { cout << s << endl; }
    void set(char *str);
    sample operator=(sample &ob);
};
 
sample::sample()
{
    s = new char('\0');
}
 
sample::sample(const sample &ob)
{
    s = new char[strlen(ob.s) + 1];
    strcpy(s, ob.s);
}
 
void sample::set(char *str)
{
    s = new char[strlen(str) + 1];
    strcpy(s, str);
}
 
sample sample::operator=(sample &ob)
{
    if(strlen(ob.s) > strlen(s)){
        delete [] s;
        s = new char[strlen(ob.s) + 1];
    }
    strcpy(s, ob.s);
    return *this;
}
 
sample input()
{
    char instr[80];
    sample str;
 
    cout << "Введите строку: ";
    cin >> instr;
 
    str.set(instr);
    return str;
}
 
int main()
{
    sample ob;
 
    ob = input();
    ob.show();
 
    return 0;
}
При компилировании в g++ (версия 5.4.0) выдает следующую ошибку:
Bash
1
2
3
4
5
6
7
test.cpp: In function ‘int main()’:
test.cpp:61:12: error: invalid initialization of non-const reference of type ‘sample&’ from an rvalue of type ‘sample’
  ob = input();
            ^
test.cpp:35:8: note:   initializing argument 1 of ‘sample sample::operator=(sample&)’
 sample sample::operator=(sample &ob)
        ^
Если изменить перегружаемую функцию присваивания на следующую:
C++
1
2
3
4
5
6
7
8
9
sample sample::operator=(sample ob)
{
    if(strlen(ob.s) > strlen(s)){
        delete [] s;
        s = new char[strlen(ob.s) + 1];
    }
    strcpy(s, ob.s);
    return *this;
}
, то результат работы программы следующий:
Bash
1
2
3
4
5
Введите строку: Привет
Освобождение s-памяти
Освобождение s-памяти
Привет
Освобождение s-памяти
Хотя в книге такой результат:
Bash
1
2
3
4
5
6
Введите строку: Привет
Освобождение s-памяти
Освобождение s-памяти
Освобождение s-памяти
Привет
Освобождение s-памяти
Вопрос: почему может не компилироваться код из книги?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.08.2017, 21:53
Ответы с готовыми решениями:

Почему не работает программа-пример для демонстрации работы функции strcmp (из книги Шилдта)?
Здравствуйте, помогите пожалуйста разобраться, почему программа не выполняется как надо. Программа-пример, для демонстрации работы функции...

Указатели на структуры. Программа-пример из книги Шилдта
Здравствуйте. Прошу проверить, правильно ли я поняла значение каждой строчки, т.к. в книге построчного объяснения не дается. Еще хотелось...

Найти и исправить ошибку в коде с пузырьковой сортировкой (пример из книги Шилдта)
программа сортировки массива пузырьковым методом из книги Шилдта. компилятор на 15, 18, 24, 26, 27, 28, 36 пишет ошибка invalid types...

7
2 / 2 / 0
Регистрация: 22.09.2016
Сообщений: 24
07.08.2017, 22:06
В 15 и 35 строке попробуйте sample operator=(sample &ob) заменить на sample operator=(sample const& ob);
1
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 18
07.08.2017, 22:19  [ТС]
Теперь компилирует без ошибок, но снова на один вывод строки "Освобождение s-памяти" меньше, чем ожидается в книге.
0
2 / 2 / 0
Регистрация: 22.09.2016
Сообщений: 24
07.08.2017, 22:33
Код какой - то неадекватный, в конструкторе new для единичных объектов, в деструкторе для массивов. Да и должно здесь быть три вызова деструктора
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
07.08.2017, 22:46
Ребята внимательнее читайте тему! Отвечу на единственный вопрос:

Цитата Сообщение от Validator Посмотреть сообщение
Вопрос: почему может не компилироваться код из книги?
Потому, что у вас в коде русские буквы, а Шилд вряд ли их использует. И не компилируется потому, что ошиблись вы или переводчики(издатели) книги - они как правило заканчивали филологический и отстают в программировании.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
07.08.2017, 23:51
Цитата Сообщение от Validator Посмотреть сообщение
Хотя в книге такой результат:
Во-первых, в книгах Шилдта много ошибок. Шилдт - не очень высококвалифицированный автор. Грубые ошибки в вашем коде "из книги" - как раз яркий пример.

Во-вторых, в общем случае количество вызовов конструкторов копирования (и, соответственно, деструкторов в коде), использующем копирование объектов, зависит от реализации. Никакая книга не может вам предсказать, что будет и чего не будет. В каждом компиляторе может быть по своему. Поэтому ожидать совпадения с книгой смысла нет.
1
0 / 0 / 0
Регистрация: 24.12.2012
Сообщений: 18
08.08.2017, 16:26  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Во-первых, в книгах Шилдта много ошибок. Шилдт - не очень высококвалифицированный автор. Грубые ошибки в вашем коде "из книги" - как раз яркий пример.
Во-вторых, в общем случае количество вызовов конструкторов копирования (и, соответственно, деструкторов в коде), использующем копирование объектов, зависит от реализации. Никакая книга не может вам предсказать, что будет и чего не будет. В каждом компиляторе может быть по своему. Поэтому ожидать совпадения с книгой смысла нет.
Судя по всему, в функции
C++
1
sample sample::operator=(sample ob)
после строки
C++
1
delete [] s;
должен быть вывод
C++
1
cout << "Освобождение s-памяти" << endl;
Тогда, с учетом этого исправления:
Цитата Сообщение от kekchpek Посмотреть сообщение
В 15 и 35 строке попробуйте sample operator=(sample &ob) заменить на sample operator=(sample const& ob);
выведется "Освобождение s-памяти" 4 раза. Если я правильно понимаю, то происходит это по следующим причинам:

1 раз: при завершении функции sample input(), т.к. объект sample str выходит из области видимости;
2 раз: в функции sample sample::operator=(sample const& ob) при освобождении памяти;
3 раз: при разрушении копии объекта, который сформировала функция sample input(), в строке инициализации ob=input();
4 раз: при выходе из функции main().
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
08.08.2017, 20:44
VS2015
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
55
56
57
58
59
60
61
#include <iostream>
#include <cstdlib>
#pragma warning(disable : 4996)
using namespace std;
class sample {
    char *s;
public:
    sample(); // normal constructor
    sample(const sample &ob); // copy constructor
    ~sample() { if (s) delete[] s; cout << "Freeing s\n"; }
    void show() { cout << s << "\n"; }
    void set(char *str);
    sample operator=(sample &ob); // overload assignment
};
// Normal constructor.
sample::sample()
{
    s = new char('\0'); // s points to a null string.
}
// Copy constructor.
sample::sample(const sample &ob)
{
    s = new char[strlen(ob.s) + 1];
    strcpy(s, ob.s);
}
// Load a string.
void sample::set(char *str)
{
    s = new char[strlen(str) + 1];
    strcpy(s, str);
}
// Overload assignment operator.
sample sample::operator=(sample &ob)
{
    /* If the target memory is not large enough
    then allocate new memory. */
    if (strlen(ob.s) > strlen(s)) {
        delete[] s;
        s = new char[strlen(ob.s) + 1];
    }
    strcpy(s, ob.s);
    return *this;
}
// Return an object of type sample.
sample input()
{
    char instr[80];
    sample str;
    cout << "Enter a string: ";
    cin >> instr;
    str.set(instr);
    return str;
}
int main()
{
    sample ob;
    // assign returned object to ob
    ob = input(); // This is now OK
    ob.show();
    return 0;
}
Миниатюры
Не работает пример из Шилдта  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.08.2017, 20:44
Помогаю со студенческими работами здесь

Synchronized. Не работает пример из книги Шилдта «Java. Полное руководство»
Я нашёл ошибку в книге Герберта Шилдта «Java. Полное руководство». Это не задача из книги. Это опячатка. Там при описании синхронизации...

Пример из справочника Шилдта
У кого есть Герберт Шилдт? На странице 411, в методе static string reverse (string a) зачем нужна переменная j в цикле for?

Объясните подробней пример из книги Шилдта
using System; class RangeArray { // Закрытые данные. int а; // ссылка на базовый массив int lowerBound; // наименьший индекс int...

Пример из книги Шилдта. Интерфейсные свойства
Добрый вечер всем программистам. Почему при выполнении этого кода в режиме отладки выводятся совсем другие значения. using System; ...

Пример из учебника Шилдта - пояснить результат выполнения программы
Растолкуйте, пожалуйста, следующий пример ... public void Push(char ch) { if(tos==stck.Length) { Console.WriteLine (&quot; - Стек...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru