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

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

Войти
Регистрация
Восстановить пароль
 
iNsomNia7
2 / 2 / 0
Регистрация: 19.11.2012
Сообщений: 32
#1

Строки, наследование - C++

14.09.2013, 18:40. Просмотров 373. Ответов 6
Метки нет (Все метки)

Задача:
Вспомните пример STRCONV из главы 8. Класс String в этом примере имеет дефект: у него нет защиты на тот случай, если его объекты будут инициа- лизированы слишком длинной строкой (константа SZ имеет значение 80). Например, определение
String s = "Эта строка имеет очень большую длину и мы можем быть уверены, что она не уместится в отведенный буфер, что приведет к непредсказуемым последствиям.";
будет причиной переполнения массива str строкой s с непредсказуемыми последствиями вплоть до краха системы.
Создадим класс Pstring, производный от класса String, в котором предот- вратим возможность переполнения буфера при определении слишком длинной строковой константы. Новый конструктор производного класса будет копировать в str только SZ-1 символов, если строка окажется слиш- ком длинной, и будет копировать строку полностью, если она будет иметь длину меньшую, чем SZ. Напишите функцию main() программы для про- верки ее работы со строками разной длины.
Мое решение:

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
//9-2.cpp
#include <iostream>
#include <cstring>
using namespace std;
 
const int SZ = 80;
 
class String
{
protected:
    char stroka[SZ];
public:
    String()
    { stroka[0] = '\0'; }
    String(char a[])
    { strcpy(stroka, a);}
    void getstring()
    {
        cout << "Enter the string: ";
        cin >> stroka;
    }
    void disp() const
    {
        cout << "String: " << stroka << endl;
    }
};
 
class Pstring: public String
{
public:
    Pstring(char b[])
    { 
        if(strlen(b) > SZ -1)
        {
            for(int j = 0; j < SZ - 1; j++)
            {
                stroka[j] = b[j];
            }
            stroka[SZ - 1] = '\0';
        }
        else
            String(b);
    }
};
 
void main()
{
    Pstring s1 = "It's very long string, which may be, yes, no, just larger then SZ = 80!!aaaaaaaaaadfgdfgdfgdfgdfgdgdfgd";
    s1.disp();
    Pstring s2 = "Eto norma!";
    s2.disp();
    system("pause");
}
Не могу понять почему не считывается короткая строка, помогите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2013, 18:40     Строки, наследование
Посмотрите здесь:

НАСЛЕДОВАНИЕ C++
Наследование C++
C++ Наследование?!
C++ Наследование\строки
C++ наследование С++
C++ Наследование
наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
14.09.2013, 18:58     Строки, наследование #2
C++
1
2
3
4
5
6
7
void main()
{
    Pstring s1("qwer");
    s1.getstring();
    s1.disp();
    system("pause");
}
Все считывается. В чем конкретно проблема?
iNsomNia7
2 / 2 / 0
Регистрация: 19.11.2012
Сообщений: 32
14.09.2013, 19:05  [ТС]     Строки, наследование #3
Цитата Сообщение от ViktorKozlov Посмотреть сообщение
C++
1
2
3
4
5
6
7
void main()
{
    Pstring s1("qwer");
    s1.getstring();
    s1.disp();
    system("pause");
}
Все считывается. В чем конкретно проблема?
Функция getstring() для решения задачи не нужна, написал на автомате.
Мне необходимо, чтобы объект инициализировался значением "Eto norma" при создании, значит проблема где-то в конструкторе, а найти ее самостоятельно не могу
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
14.09.2013, 19:09     Строки, наследование #4
C++
1
2
else
    String(b);
Что это?
iNsomNia7
2 / 2 / 0
Регистрация: 19.11.2012
Сообщений: 32
14.09.2013, 19:17  [ТС]     Строки, наследование #5
Цитата Сообщение от ViktorKozlov Посмотреть сообщение
Что это?
Если строка меньше 80 символов, то используем конструктор базового класса String с одним аргументом типа char[]
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
14.09.2013, 19:22     Строки, наследование #6
Конструктор базового класса можно использовать только в списке инициализации
C++
1
2
3
Pstring(char b[]):String(b)
    { 
        //...
но в вашем случае это не подойдет, так как тогда не получится сделать предварительную проверку, а конструктор базового класса вызывается всегда в первую очередь.
У вас же это просто создание временного объекта String, которое не несет никакой смысловой нагрузки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2013, 19:30     Строки, наследование
Еще ссылки по теме:

C++ Наследование
C++ Закрытое наследование. Вывод строки
C++ Наследование
C++ Наследование

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

Или воспользуйтесь поиском по форуму:
iNsomNia7
2 / 2 / 0
Регистрация: 19.11.2012
Сообщений: 32
14.09.2013, 19:30  [ТС]     Строки, наследование #7
Цитата Сообщение от ViktorKozlov Посмотреть сообщение
Конструктор базового класса можно использовать только в списке инициализации
C++
1
2
3
Pstring(char b[]):String(b)
    { 
        //...
но в вашем случае это не подойдет, так как тогда не получится сделать предварительную проверку, а конструктор базового класса вызывается всегда в первую очередь.
У вас же это просто создание временного объекта String, которое не несет никакой смысловой нагрузки
Заменил на

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Pstring(char b[])
    { 
        if(strlen(b) > SZ -1)
        {
            for(int j = 0; j < SZ - 1; j++)
            {
                stroka[j] = b[j];
            }
            stroka[SZ - 1] = '\0';
        }
        else
            strcpy(stroka, b);
    }
Теперь все работает, спасибо большое
Yandex
Объявления
14.09.2013, 19:30     Строки, наследование
Ответ Создать тему
Опции темы

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