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

От класса String наследовать новый класс, который имеет проверку на превышение размера строки

26.01.2017, 22:12. Просмотров 826. Ответов 3
Метки нет (Все метки)

Доброго времени суток!

Решаю задачи из учебника Роберта Лафоре ООП в C++.
До этой задачи все решал сам и успешно, а тут встал в ступор. Объясните, пожалуйста, в чем может быть проблема?

Задача из 9 главы, номер 2.
Суть в том, чтобы имея класс String, наследовать от него новый класс Pstring которые имеет проверку на превышение размера строки.
Если строка будет меньшего размера, то нужно вызвать конструктор базового класса.
Если строка будет больше, чем возможный размер массива символов, то вставить в этот массив только те символы, которые уберутся.

Полный код:
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
66
67
68
69
#include <iostream>
#include <string.h>
 
using namespace std;
 
class String
{
  protected:
    enum { SZ = 10 };
    char str [ SZ ];
  public:
    String()
    { 
        str[0] = '\x0'; 
    }
    
    String(char s[])
    { 
        strcpy(str,s); 
    } 
    
    void display() const
    {
        cout << str << endl;
    }
    
    operator char*()
    {
        return str; 
    }
};
 
class Pstring : public String
{
    public:
        Pstring(char s[])
        {
            int size = strlen(s);
            if(size >= SZ)        
            {
                for(int j = 0 ;j < SZ ;j++) 
                {
                    str[j] = s[j];
 
                    if (j == SZ - 1)
                    {
                        str[j] = '\x0';
                    }
                }
            }
            else
            {
              String(s);
            }
        }
 
};
 
int main()
{
    Pstring str1("012345");
    str1.display();
    Pstring str2("01234567890123456789");
    str2.display();
    Pstring str3("0123456789");
    str3.display();
 
    return 0;
}
Проблемное место (строки с 51 по 54 включительно):
C++
1
2
3
4
else
{
    String(s);
}
И вопрос:
почему при попадании в эту ветку, в Locals отображается ещё один s, который и передается в базовый конструктор, вместо набора символов "012345", который передается в конструктор объекту str1?
0
Миниатюры
От класса String наследовать новый класс, который имеет проверку на превышение размера строки  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2017, 22:12
Ответы с готовыми решениями:

Создать класс Point, который имеет два закрытых члена класса (координаты)
Помогите плиз код написать. Я чёт не очень понимаю в классах. Создайте класс...

Класс, который невозможно наследовать
Как создать класс, который невозможно наследовать? Видимо, поместить...

Создайте класс employee, который содержит имя (объект класса string) и номер (типа long) служащего
Создайте класс employee, который содержит имя (объект класса string) и но- мер...

Можно-ли наследовать класс, в котором определен объект текущего класса?
Подскажите, пожалуйста, можно-ли делать так: class A { public: B objB;...

Проинициализировать класс массивов который имеет конструктор по умолчанию
Или я не знаю как правельно спрасить у гуглы,или это не возможно,кто знает как...

3
nonedark2008
1098 / 818 / 237
Регистрация: 28.07.2012
Сообщений: 2,293
27.01.2017, 00:28 2
Лучший ответ Сообщение было отмечено Tervas как решение

Решение

Tervas, конструктор объекта вызывается только один раз. При этом, когда начинает работать конструктор Pstring, конструктор базового класса (конструктор по-умолчанию для String) уже отработал.
Так что
Цитата Сообщение от Tervas Посмотреть сообщение
String(s);
просто сконструирует временный объект, а затем его сразу удалит.
Можно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        Pstring(char s[]) : String(strlen(s) < SZ ? s : "")
        {
            int size = strlen(s);
            if(size >= SZ)        
            {
                for(int j = 0 ;j < SZ ;j++) 
                {
                    str[j] = s[j];
 
                    if (j == SZ - 1)
                    {
                        str[j] = '\x0';
                    }
                }
            }
        }
1
nd2
2837 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
27.01.2017, 01:49 3
Цитата Сообщение от Tervas Посмотреть сообщение
Задача из 9 главы, номер 2.
Суть в том, чтобы имея класс String, наследовать от него новый класс Pstring которые имеет проверку на превышение размера строки.
Если строка будет меньшего размера, то нужно вызвать конструктор базового класса.
В задании не сказано, что нужно вызывать конструктор базового класса.
1
Tervas
0 / 0 / 0
Регистрация: 23.01.2017
Сообщений: 2
27.01.2017, 10:15  [ТС] 4
nonedark2008, спасибо!
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Можно сделать так:
Этот вариант сработал, пожалуй, перечитаю ещё раз 9 главу.

Цитата Сообщение от nd2 Посмотреть сообщение
В задании не сказано, что нужно вызывать конструктор базового класса.
Видимо, глаза замылились, буду читать задание более внимательно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2017, 10:15

Реализовать класс MyString, который будет являться аналогом класса String языка C#
Добрый день! Нужно реализовать класс MyString, который будет являться аналогом...

Создать класс, который имеет параметризованный метод, который рассчитывает, простое ли число
Создать класс, который имеет параметризованный метод, который рассчитывает,...

Производный класс Самоорганизующаяся таблица должен наследовать свойства и методы класса Таблица
класс таблица, содержащий целые числа Обьект класса таблица должен...


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

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

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